上一篇咱们讲了在微信浏览器内实现微信支付的功能,它特别适合于一些基于微信公众号的h5站点等,支付流程也至关流畅,可是...php
还有一种状况,好比如今北哥兄弟连PC版,是生成了一个二维码,这个二维码是专属的,扫描后直接就蹦出了支付页面。如今告诉你它如何实现的~html
本文相关框架json
Yii2浏览器
EasyWechat服务器
上节课咱们讲了一个很重要的概念,那就是预支付交易回话标识 “咱们先调用接口在微信支付服务后台生成预支付交易单,返回正确的预支付交易回话标识后再按扫码、JSAPI、APP等不一样场景生成交易串调起支付。”微信
换句话说,获取预支付交易回话标识 这步基本都是一致的,不一样就在于场景不一样,你们必定要触类旁通。yii2
那么你还记得上篇咱们获取 预支付交易回话标识 的代码实现么?app
忘记了?那你先穿越下:开启穿越门框架
核心就是这段代码yii
我先来模拟一个场景,假设咱们如今有一个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的配置等。
接下来咱们还会将微信企业支付接口和微信发红包接口这两个微信支付。
(完)