这里要啰嗦的是,如何你写的是有关商品买卖的小程序,那么需要在支付前再次检测一下库存量,因为用户下完订单后不一定马上就会付款,如果在付款的期间库存量没了便会出现问题。业务逻辑我就不说太多了,这取决于你写代码的严谨性。
在我们引入了上面那个文件后,先实例化这个类WxPayUnifiedOrder,把需要的参数通过调用对应的方法传入。
伪代码如下:
//调用微信支付统一下单接口 $wxOrderData = new \WxPayUnifiedOrder(); //设置相关参数 $wxOrderData->SetOut_trade_no($this->orderNO); $wxOrderData->SetTrade_type('JSAPI'); $wxOrderData->SetTotal_fee($totalPrice * 100); //这里的价格单位是分 $wxOrderData->SetBody('Mc'); $wxOrderData->SetOpenid($openid); $wxOrderData->SetNotify_url(config('secure.pay_back_url'));//支付回调
其中第一个是你的订单号,订单号的生成方法可以自定义,第二个是死参数,第三个是总订单价格,第四个是名称如果是中文的话要转码,第四个是openID,这个这时候就可以从缓存中取了。最后一个是支付回调,就是支付成功后微信要访问的地址。必须是公网能访问的,或者你使用ngrok来进行反向代理转发本地的服务器。
参数设置好了之后,就直接调用SDK的方法了
$wxOrder = \WxPayApi::unifiedOrder($wxOrderData);
如果参数没有错误的话,返回的数据中会含有prepay_id,这个是我们需要的参数。
3.再次签名
// 提交JSAPI输入对象 $jsApiPayData = new \WxPayJsApiPay(); //设置appid $jsApiPayData->SetAppid(config('wx.app_id')); //timeStamp $jsApiPayData->SetTimeStamp((string)time()); //随机串 $randStr = md5(time().mt_rand(0,1000)); $jsApiPayData->SetNonceStr($randStr); //数据报 $jsApiPayData->SetPackage('prepay_id='.$wxOrder['prepay_id']); //类型 $jsApiPayData->SetSignType('MD5'); //生成签名 $sign = $jsApiPayData->MakeSign(); //获得签名数组 $signData = $jsApiPayData->GetValues(); //增加字段paySign $signData['paySign']=$sign; //删除signData中的app_Id字段 unset($signData['appId']); return $signData;
再次签名完成后,就把五个参数返回给小程序。
四,小程序获取五个参数后,鉴权调起支付
伪代码(小程序端)
// 提交JSAPI输入对象 $jsApiPayData = new \WxPayJsApiPay(); //设置appid $jsApiPayData->SetAppid(config('wx.app_id')); //timeStamp $jsApiPayData->SetTimeStamp((string)time()); //随机串 $randStr = md5(time().mt_rand(0,1000)); $jsApiPayData->SetNonceStr($randStr); //数据报 $jsApiPayData->SetPackage('prepay_id='.$wxOrder['prepay_id']); //类型 $jsApiPayData->SetSignType('MD5'); //生成签名 $sign = $jsApiPayData->MakeSign(); //获得签名数组 $signData = $jsApiPayData->GetValues(); //增加字段paySign $signData['paySign']=$sign; //删除signData中的app_Id字段 unset($signData['appId']); return $signData;
如果一切正常的话,在微信开发者工具就会显示这个二维码,
如果在真机上测试的话,就会直接弹出支付页面。小程序会直接显示支付成功或者失败的页面,然后微信服务器就会开始访问我们之前设置的支付回调地址来推送支付结果,根据结果可以来更新订单的状态。这里我就不写业务逻辑了,大概讲一下就好。
五,支付回调
实际上我们需要重写WxPayNotify类的NotifyProcess方法,这里记得Loader::impor()引入那个入口类。
/** * * 回调方法入口,子类可重写该方法 * 注意: * 1、微信回调超时时间为2s,建议用户使用异步处理流程,确认成功之后立刻回复微信服务器 * 2、微信服务器在调用失败或者接到回包为非确认包的时候,会发起重试,需确保你的回调是可以重入 * @param array $data 回调解释出的参数 * @param string $msg 如果回调处理失败,可以将错误信息输出到该方法 * @return true 回调出来完成不需要继续回调,false回调处理未完成需要继续回调 */ public function NotifyProcess($data, &$msg) { //TODO 用户基础该类之后需要重写该方法,成功的时候返回true,失败返回false return true; }