之前写过一篇文章《微信小程序可以完成微信支付但没有回调,也没有完成订单状态》,讲的是在使用禾匠商城购物小程序的过程,小程序配置都没有问题,也能够发起支付,并且支付成功,可就是没有完成订单状态,也就是说,服务端没有收到支付回调。
这种问题,不仅禾匠商城购物小程序有这个问题,志汇餐饮外卖小程序也有同样的问题,并且据我研究,这个是微擎微赞系统的通病!更有可能是微信支付本身的BUG。
也有朋友说是微信支付那边不支持https443端口的回调url导致的,不过咱们没办法去改变微信,只能改变自己的代码,这里再系统化的说一下,遇到这种没有问题该怎么解决。
思路:既然没有支付回调,先找到设置回调地址的代码
根据我们对微信支付开发的代码分析,所有设置支付回调的代码都有同样的参数“notify_url”,所以就很简单了,这里以志汇餐饮小程序为例,找到代码:
private function unifiedorder() {
$url = ‘https://api.mch.weixin.qq.com/pay/unifiedorder’;
$parameters = array(
‘appid’ => $this->appid, //小程序ID
‘mch_id’ => $this->mch_id, //商户号
‘nonce_str’ => $this->createNoncestr(), //随机字符串
// ‘body’ => ‘test’, //商品描述
‘body’ => $this->body,
// ‘out_trade_no’ => ‘2015450806125348’, //商户订单号
‘out_trade_no’=> $this->out_trade_no,
// ‘total_fee’ => floatval(0.01 * 100), //总金额 单位 分
‘total_fee’ => $this->total_fee,
// ‘spbill_create_ip’ => $_SERVER[‘REMOTE_ADDR’], //终端IP
‘spbill_create_ip’ => $_SERVER[‘REMOTE_ADDR’], //终端IP
//’notify_url’ => ‘http://www.weixin.qq.com/wxpay/pay.php’, //通知地址 确保外网能正常访问
‘notify_url’ => $this->root.’addons/zh_dianc/payment/wechat/notify.php’, //通知地址 确保外网能正常访问
‘openid’ => $this->openid, //用户id
‘trade_type’ => ‘JSAPI’//交易类型
);
很明显是 “ $this->root.”这个地方出了问题,继续翻代码,看看 root 是哪来的
function __construct($appid, $openid, $mch_id, $key,$out_trade_no,$body,$total_fee,$root)
是类的初始化参数,那我们就反查类的创建对象,找到代码块:
pdo_update(‘wpdc_ydorder’, array(‘ydcode’ => $out_trade_no), array(‘id’ => $_GPC[‘order_id’]));$total_fee = $_GPC[‘money’];$root = $_W[‘siteroot’];if (empty($total_fee)) //押金{$body = “订单付款”;$total_fee = floatval(99 * 100);} else {$body = “订单付款”;$total_fee = floatval($total_fee * 100);}$weixinpay = new WeixinPay($appid, $openid, $mch_id, $key, $out_trade_no, $body, $total_fee, $root);$return = $weixinpay->pay();echo json_encode($return);}
很明显,就是“$root = $_W[‘siteroot’];”这句代码的问题了,根据之前的经验,我们稍加修改就可以了,完成以后我们再进行支付测试,就可以发现正常了。
完整代码下载:
[reply]这部分是付费服务,免费的请根据本文自行修复BUG[/reply]