最近在使用禾匠商城小程序模块的时候,遇上了一个很头疼的问题,可以发起微信支付,也能够支付成功,但支付之后,订单状态还是显示未支付。
根据经验,这很大概率是微信支付回调没有设置好,先检查微信支付的3个产品有没有开通:《微信小程序调用支付JSAPI缺少参数: total_fee的解决办法》
然后再看看微擎微赞系统有没有开启https功能:《微擎https与微信支付的坑》
反复检查了一下,上面设置都没有什么问题,只能从代码方面找原因了,微信支付回调的统一接口:
禾匠商城小程序的目录太多,并且目录命名也比较任性,找到对应的文件很难,根据以前开发的经验,微信支付回调接口都有统一的必填参数:“notify_url”
直接全盘检索“notify_url”,找到对应的代码块:
$res = $this->wechat->pay->unifiedOrder([
‘body’ => $goods_names,
‘out_trade_no’ => $this->order->order_no,
‘total_fee’ => $this->order->pay_price * 100,
‘notify_url’ => \Yii::$app->request->hostInfo . \Yii::$app->request->baseUrl . ‘/pay-notify.php’,
‘trade_type’ => ‘JSAPI’,
‘openid’ => $this->user->wechat_open_id,
]);
再进一步查看hostInfo函数的代码
public function getHostInfo()
{
if ($this->_hostInfo === null) {
$secure = $this->getIsSecureConnection();
$http = $secure ? ‘https’ : ‘http’;
if (isset($_SERVER[‘HTTP_HOST’])) {
$this->_hostInfo = $http . ‘://’ . $_SERVER[‘HTTP_HOST’];
} elseif (isset($_SERVER[‘SERVER_NAME’])) {
$this->_hostInfo = $http . ‘://’ . $_SERVER[‘SERVER_NAME’];
$port = $secure ? $this->getSecurePort() : $this->getPort();
if (($port !== 80 && !$secure) || ($port !== 443 && $secure)) {
$this->_hostInfo .= ‘:’ . $port;
}
}
}return $this->_hostInfo;
}
找到原因了:
[reply]https默认端口是443,微信支付异步通知只支持绑定80端口的域名,需要把https 替换为 http就可以了[/reply]
修改完成后刷新微擎、禾匠商城小程序的缓存,重启一下IIS,再试一下微信支付,果然可以了。