Skip to content
thenbsp edited this page Mar 5, 2016 · 10 revisions

描码支付(永久模式)

该模式需要设置 公众号后台 -> 微信支付 -> 开发配置 -> 描码支付 -> 支付回调 URL

描码支付的永久模式,是应用于一些 一旦生成之后不可改变 的线下场景中,比如公交站牌上的二维码,因此在生成这种二维码时,只需要在二维码中保存订单(或产品)的唯一标识即可,当用户扫码时,利用唯一标识再去 支付回调 URL 调用订单(或产品)信息。

use Thenbsp\Wechat\Payment\Qrcode\Forever;

// 定义产品(或订单)唯一标识
$productId = date('YmdHis').mt_rand(10000, 99999);

// 获取支付链接
$qrcode = new Forever('appid', 'mch_id', 'key');

// 为 $productId 生成二维码
$payurl = $qrcode->getPayurl($productId);

HTML

示例中使用的在线二维码生成工具,实际应用中可使用第三方包生成二维码。

<img src="http://qr.liantu.com/api.php?&bg=ffffff&fg=000000&text=<?php echo $payurl; ?>" />

响应订单

现在,当用户扫码时,Request 对象中将包含 订单的唯一标识,即 product_id。

use Thenbsp\Wechat\Payment\Unifiedorder;
use Thenbsp\Wechat\Payment\Qrcode\ForeverCallback;

$callback = new ForeverCallback();

if( !$callback->containsKey('product_id') ) {
    $callback->fail('Invalid Request');
}

// $callback['product_id'] 就是生成二维码时的订单ID
// 现在只需要根据这个 ID 把订单信息查出来,去下单

// 去下单
$unifiedorder = new Unifiedorder('appid', 'mch_id', 'key');
$unifiedorder->set('body',          '微信支付测试商品');
$unifiedorder->set('total_fee',     1);
$unifiedorder->set('openid',        'OPENID');
$unifiedorder->set('out_trade_no',  date('YmdHis').mt_rand(10000, 99999));
$unifiedorder->set('notify_url',    'http://example.com/your-notify.php');

// 返回这个订单
$callback->success($unifiedorder);

调试 Request

use Symfony\Component\HttpFoundation\Request;
use Thenbsp\Wechat\Payment\Qrcode\ForeverCallback;

// 创建 Request 对象
$request = Request::createFromGlobals();

// 输出到日志
$logger->debug($request->getContent());

// 指定 Request
$callback = new ForeverCallback($request);

if( !$callback->containsKey('product_id') ) {
    $callback->fail('Invalid Request');
}

// ...