很早之前做过一次微信扫码支付,但是时间太久了,昨天居然跳到了之前爬过得坑里~~这次一定要记下来
首先,我们有好几种的方式去做这个微信扫码支付~
第一种: 使用微信官方的SDK
官方的SDK都已经为你写好了代码,改了配置拿过来就能用,不信?那自己看看~~
这个文件就是扫码支付的代码,拿到自己项目里大概就是这样~~
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
public function wxpay(){ //$pay = new CoreApi_Wxpay(); //$pay->placeOrder();die; $data['create_time'] = time(); require_once (FW_PATH . '/plugins/wxpay/lib/WxPay.Config.php'); require_once(FW_PATH . '/plugins/wxpay/lib/WxPay.Api.php'); require_once(FW_PATH . '/plugins/wxpay/example/WxPay.JsApiPay.php'); $input = new WxPayUnifiedOrder(); $input->SetBody("test"); $input->SetAttach("test"); $input->SetOut_trade_no(WxPayConfig::MCHID.date("YmdHis")); $input->SetTotal_fee("1"); $input->SetTime_start(date("YmdHis")); $input->SetTime_expire(date("YmdHis", time() + 600)); $input->SetGoods_tag("test"); $input->SetNotify_url("http://paysdk.weixin.qq.com/example/notify.php"); $input->SetTrade_type("NATIVE"); $input->SetProduct_id("123456789"); $wx_data = WxPayApi::unifiedOrder($input); $wx_data['package_value'] = 'Sign=WXPay'; p($wx_data); $result = array2object($wx_data); $imgPath = $this->payCode($result->code_url); p('<img src='.$imgPath.'>'); } public function payCode($url){ $renderer = new \BaconQrCode\Renderer\Image\Png(); $renderer->setHeight(256); $renderer->setWidth(256); $writer = new \BaconQrCode\Writer($renderer); $saveUrl = '/upload/wxpay/'.$_SESSION['uid'].'-'.uniqid().'.png'; $path = $_SERVER['DOCUMENT_ROOT'].$saveUrl; if($writer->writeFile($url,$path)){ p($saveUrl); return $saveUrl; }else{ p('图片写入失败'); } } |
然后改一下配置文件: 在SDK的 lib/WxPay.Config.php
全部修改成自己的配置文件后,请求接口得到数据如下:
1 2 3 4 5 6 7 8 9 10 11 12 |
( [return_code] => SUCCESS [return_msg] => OK [appid] => wx160e3374cdfe6015 [mch_id] => 1396140202 [nonce_str] => IduwryPAdjITOJAQ [sign] => EEF7E2D54C788E5D336906DCFFBA30EC [result_code] => SUCCESS [prepay_id] => wx20161028102132941ec8ac8d0301660763 [trade_type] => NATIVE [code_url] => weixin://wxpay/bizpayurl?pr=uluDK7b ) |
根据文档说明:这样的结果就是已经成功了,我们把 code_url 里面的 weixin://wxpay/bizpayurl?pr=uluDK7b 这个地址生成一个二维码图片,
我们使用composer 安装 BaconQrCode 这个包!
安装完成后具体代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 |
$renderer = new \BaconQrCode\Renderer\Image\Png(); $renderer->setHeight(256); $renderer->setWidth(256); $writer = new \BaconQrCode\Writer($renderer); $saveUrl = '/upload/wxpay/'.$_SESSION['uid'].'-'.uniqid().'.png'; $path = $_SERVER['DOCUMENT_ROOT'].$saveUrl; if($writer->writeFile($url,$path)){ p($saveUrl); return $saveUrl; }else{ p('图片写入失败'); } |
然后扫描一下生成的二维码,如果不出意外,结果就是这样~~
后续就不说了,在回调里面有一堆的判断,在 native_notify.php 文件里,
第二种方法,使用第三方的库
首先我们需要使用composer 安装 这个库
$ composer require overtrue/wechat:~3.1 -vvv
|
文档地址: https://easywechat.org/zh-cn/docs/payment.html
很简单根据库里面的方法,配置参数就行,这个文档特别详细~
扫码支付成功后的回调方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
/** 微信扫码支付成功的异步回调地址 * @return \Symfony\Component\HttpFoundation\Response */ public function Callback(){ $payment = $this->config(); $response = $payment->handleNotify(function($notify, $successful){ // 使用通知里的 "微信支付订单号" 或者 "商户订单号" 去自己的数据库找到订单 $orderNo = $notify->transaction_id; //订单Id $payment = $this->config(); $order = $payment->query($orderNo); if (!$order) { // 如果订单不存在 return 'Order not exist.'; // 告诉微信,我已经处理完了,订单没找到,别再通知我了 } // 如果订单存在 // 检查订单是否已经更新过支付状态 if ($order->paid_at) { // 假设订单字段“支付时间”不为空代表已经支付 return true; // 已经支付成功了就不再更新了 } // 用户是否支付成功你 if ($successful) { // 不是已经支付状态则修改为已经支付状态 $order->paid_at = time(); // 更新支付时间为当前时间 $order->status = 'paid'; } else { // 用户支付失败 $order->status = 'paid_fail'; } $this->save($order);// 保存订单 return true; // 返回处理完成 }); return $response; } |
大概就是这样~~