产生这个问题的原因是:调用微信接口传入的参数spbill_create_ip与实际支付时获取的不一致
官方文档仅告知了原因,但是没有给予可实际操作的方法。https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_4
首先,注释掉这一行[Wxpay/lib/WxPay.Api.php]
//$inputObj->SetSpbill_create_ip($_SERVER['REMOTE_ADDR']);//终端ip
然后在业务代码中,新增函数get_client_ip();
/**
* 获取客户端IP地址
* @return string
*/
function get_client_ip() {
if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
$ip = getenv('HTTP_CLIENT_IP');
} elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
$ip = getenv('HTTP_X_FORWARDED_FOR');
} elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
$ip = getenv('REMOTE_ADDR');
} elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
$ip = $_SERVER['REMOTE_ADDR'];
} else {
$ip = '0.0.0.0';
}
return preg_match('/[\d\.]{7,15}/', $ip, $matches) ? $matches[0] : '';
}
最后获取终端IP,再调用微信SDK的统一下单
//...
$spbill_create_ip = get_client_ip();
$input = new WxPayUnifiedOrder();
//...
$input->SetSpbill_create_ip($spbill_create_ip);
// 调用统一下单接口
$result = WxPayApi::unifiedOrder($input);
如果依然未解决,请打印相关日志,查看错误信息,或留言讨论