25

上一篇我们讲了在微信浏览器内实现微信支付的功能,它特别适合于一些基于微信公众号的h5站点等,支付流程也相当流畅,但是...

还有一种情况,比如现在北哥兄弟连PC版,是生成了一个二维码,这个二维码是专属的,扫描后直接就蹦出了支付页面。现在告诉你它如何实现的~

本文相关框架

  • Yii2

  • EasyWechat

忆往昔

上节课我们讲了一个很重要的概念,那就是预支付交易回话标识 “我们先调用接口在微信支付服务后台生成预支付交易单,返回正确的预支付交易回话标识后再按扫码JSAPIAPP等不同场景生成交易串调起支付。”

换句话说,获取预支付交易回话标识 这步基本都是一致的,不同就在于场景不同,大家一定要举一反三。

那么你还记得上篇我们获取 预支付交易回话标识 的代码实现么?

忘记了?那你先穿越下:开启穿越门

上次代码回顾

核心就是这段代码

Now

我先来模拟一个场景,假设我们现在有一个action(index.php?r=charge/qrcode)负责生成上篇文章充值花费的微信二维码,希望结果是微信扫码后,不进入任何页面,直接蹦出输入支付密码的地方,然后就支付了。

// ChargeController
use EasyWeChat\Foundation\Application;
use EasyWeChat\Payment\Order;
...
/**
 * 生成支付二维码
 **/
public function actionQrcode(){
    $charge = new Charge();
    // 刷刷刷一堆代码,就生成了未付款订单。

    // 通过EasyWechat来调用
    $config = Yii::$app->params['WECHAT'];

    $wxApp = new Application($config);
    $payment = $wxApp->payment;

    $notifyUrl = Yii::$app->request->getHostInfo() . Url::to(['/wechat/charge/notify-qrcode']);
    $attributes = [
        'trade_type'=>Order::NATIVE,//不同点
        'body'=>"商品描述",
        'detail'=>"商品简介",
        'out_trade_no'=>$charge->number,
        'total_fee'=>$charge->money*100,
        'notify_url'=>$notifyUrl
    ];
    
    $o = new Order($attributes);
    $result = $payment->prepare($o);

    if ($result->return_code == 'SUCCESS' && $result->result_code == 'SUCCESS'){
        $prepayId = $result->prepay_id;
        $codeUrl = $result->code_url;        
    }    
}
...

上面的codeUrl就是支付二维码内容,从这里你看到了,其实流程还是一样的,先获得一个prepayId(Native类型),然后获得一个codeUrl,当然,在视图里面你需要用一个库将这个codeUrl生成一个二维码(可以使用Yii的yii2-qrcode-helper库或js库都成)。

要注意:这个过程是原生的微信支付,和公众号没有半毛钱关系,因此在$attributes 里你看到了,没有 openid 这个必填项了已经,这点要尤其注意

然后浏览器就会出现一个二维码,如下图。

一个二维码

你真的用微信扫了?好纯真的少年呀,这是北哥小报的公众号二维码呀。好了,反正你将codeUrl的内容生成了一个二维码,客户微信扫描后。

客户扫描后的效果

然后客户进行支付,钱就刷刷刷的进入到微信支付平台账号啦。

哦,还有一点,就是我们如何知道微信支付成功了那,对于原生扫码支付,我们也需要给微信提供一个异步通知的地址,对,就是那个$notifyUrl,看来你认真看了上一篇。

在上面设置生成二维码代码里我们定义了一个url

$notifyUrl = Yii::$app->request->getHostInfo() . Url::to(['/wechat/charge/notify-qrcode']);

现在我们就用它来接收微信给我们的反馈

public function actionNotifyQrcode(){
    $config = Yii::$app->params['WECHAT'];
    $wxApp = new Application($config);
    $payment = $wxApp->payment;
    $response = $payment->handleNotify(function ($notify, $successful){
        if ($successful) {
            $order_arr = json_decode($notify, true);
            $transactionId = $order_arr['transaction_id'];
            // $order_arr就是微信异步通知给服务器的信息

            //todo 我们的逻辑,将charge变为已支付
        }
    });
    $response->send();
}

很奇怪是么,它和接收公众号支付类的notify是一样的,而且EasyWeChat封装的就几行代码,很是简单。

要注意:这也是一个POST请求,请关闭该方法的csrf验证,否则Yii会将其拒之门外。

这就完了么?是的。

还有其他的么

二维码支付其实比公众号设置的更简单,你也看到了,生成二维码,然后扫描接收支付通知,处理本地逻辑。

关于APP的的微信支付要往后放一放,这个还要涉及对于APP SDK的配置等。

接下来我们还会将微信企业支付接口和微信发红包接口这两个微信支付。

(完)


阿北
4.1k 声望913 粉丝