鄙人用的是php的H5支付模式, 需要将交易类型改为MWEB, 之前玩的好好的, 现在出问题了。腾讯官方文档上,只说你有误, 也不告诉你为啥有误。逼着你细细品他们那屎糊的文档,大佬说的大意是, 这回又又又又又变了, 不许你传127.0.0.1这种本地虚拟ip了, 让你来个真的客户端ip。文档地址 https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_5
说一千到一万, 玩法改了, 以前调试的路子跑不通了, 笔者费了半天劲, 用了以下代码来搞:
$notify = new NativePay(); $input = new WxPayUnifiedOrder(); $input->SetBody("test"); $input->SetAttach("test"); // 不能像以前一样虚拟一个ip出来, 必须写真实ip, 不然bug $input->SetSpbill_create_ip(getRealIp()); $input->SetOut_trade_no("sdkphp123456789" . 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(" $input->SetTrade_type("MWEB"); $input->SetProduct_id("123456789"); $weixinpay_result = $notify->GetPayUrl($input);
打出来这个weixinpay_result变量, 统统都是好的。
并不给面子, 报错。笔者项目中引用的getRealIp()函数长这样:
/** * 读取真实IP方法 */ function getRealIp(){ if ((bool) filter_var(_header('remote_addr'),FILTER_VALIDATE_IP,FILTER_FLAG_IPV4 |FILTER_FLAG_NO_PRIV_RANGE |FILTER_FLAG_NO_RES_RANGE)) { return _header('remote_addr'); } return false; }
平时100%能获取到用户ip, 断点也打了,获取的就是我的本机外网出口ip。
但是仍然不行,无论如何都是报一样的错。
解决方案: 查phpsdk库
回头看了一下phpsdk的库, 发现WxPay.Api.php里有这一行代码
// --------------坑-------------- $inputObj->SetSpbill_create_ip($_SERVER['REMOTE_ADDR']); //终端ip
哦, 原来是这样, 这是哪个控制欲强的大佬写的代码, 他们为什么不在sdk的demo里写, 而是藏在库里? 他们不知道现在已经不流行php-fpm模式了嘛, 赶快把这行注释掉!
结果, 果然跑通了。