我们要实现的就是这个功能. 接下来进行编码.
1.模拟用户点击提交订单时,应该会出现一个二维码。
$params = array('price' => 0.01, 'goodsid' => 55, 'userid' => 65); $dat = TestOrder::queryAll($params); // 入库操作,
$data = array( 'price' => $dat['price'], 'orderIdAlias' => $dat['orderIdAlias'], 'goodsid' => $dat['goodsid'] );
//微信支付的方法 $code_url = TestPayment::WeiXinNativePay($data);
if (!empty($code_url)) { return $this->render('placeanorder', [ 'codeurl' => $code_url, // 微信二维码的url ]); }
2.微信支付
调微信的统一下单接口(微信文档:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1)
组装数据
$data = array( 'appid' => self::$WeixinConfig['wxAppId'], 'mch_id' => self::$WeixinConfig['wxMchId'], 'nonce_str' => md5(microtime() . 'weixin' . rand(100, 9999)), 'body' => self::$WeixinConfig['body'], 'out_trade_no' => $params['orderIdAlias'], 'fee_type' => 'CNY', 'total_fee' => $params['price'] * 100, 'spbill_create_ip' => $_SERVER["REMOTE_ADDR"], // 或者是你服务器的ip(最好是这个) 'time_start' => date('YmdHis'), 'time_expire' => date('YmdHis', strtotime('+2 hours')), 'notify_url' => self::$WeixinConfig['notifyUrl'], 'trade_type' => 'NATIVE', 'product_id' => $params['goodsid'], ); ksort($data); $str = http_build_query($data); $str = static::joinAPI_KEY2($str); $data['sign'] = strtoupper(md5(urldecode($str))); $xml = static::arrToXML($data); //请求统一下单订单接口,微信返回的xml $result = static::postXmlCurl($xml, self::$WeixinConfig['unifiedOrder']); // 解析微信返回的xml $data = static::xmlToArr($result); if($data['RETURN_CODE'] == 'SUCCESS' && $data['RESULT_CODE'] == 'SUCCESS'){ return $data['CODE_URL']; // 这个就是微信给返回的二维码地址 } else { return '';
3.页面展示二维码
<img alt="模式二扫码支付" src="http://paysdk.weixin.qq.com/example/qrcode.php?data=<?php echo $codeurl;?>" style="width:150px;height:150px;"/>4.回调
回调的作用是看是否真正的支付了。 如果真正的支付则要修改订单的状态
$result = file_get_contents('php://input'); // ll($result,'call_back.log'); // 将微信回调返回的xml转换成数组 $dat = TestPayment::xmlToArr($result); ll(json_encode($dat), 'call_back.log'); if($dat['RETURN_CODE'] == 'SUCCESS' && $dat['RESULT_CODE'] == 'SUCCESS'){ //更改订单状态,减库存等业务操作 TestOrder::saveDb($dat); // 给微信返回xml格式,告诉微信我已经接收到回调了 $xml = TestPayment::arrToXML(['return_code' => 'SUCCESS', 'return_msg' => 'OK'],true); echo $xml; }