不久前做过一次微信支付的业务,从发起下单到回调获取支付结果整个流程都是正常的,最近又做了一个新的小程序,但是微信支付商户是同一个,只是换了个服务器和换了个小程序appid,除了更改了appid和回调url之外,代码完全一致(同样的业务)。付款是没有问题的,但是在新的服务器上回调出现了问题,可以调用回调url但是获取不到xml,而是获取到了一个很莫名其妙的数组,这个数组中的/PayNotifyTakeOut是我回调url的控制类名,它很神奇的帮我把前面的域名去掉了然后返回给我,这个是接受微信post的结果,原本这应该是个xml格式的数据:
["s" => "/PayNotifyTakeOut"]
但是以前的那个小程序就是正常的可以成功回调,可以成功拿到xml,可是不论是预支付阶段还是回调接口我都没有做过修改,为什么会区别的这么离谱??
<xml><appid>appid>
<bank_type>bank_type>
<cash_fee>cash_fee>
<fee_type>fee_type>
<is_subscribe>is_subscribe>
<mch_id>mch_id>
<nonce_str>nonce_str>
<openid>openid>
<out_trade_no>out_trade_no>
<result_code>result_code>
<return_code>return_code>
<sign>sign>
<time_end>time_end>
<total_fee>1total_fee>
<trade_type>trade_type>
<transaction_id>transaction_id>
xml>
刚开始我是认为自己修改appid啥的时候可能不小心改到了些啥,但是我认真的拿着原来的代码重新修改了两次还是一样不行,并且debug时仔细看了预支付的过程是实在的没有问题,预支付里拼装的xml是正确的,有问题应该也调起不了支付
接收post数据的函数:
public function post_data()
{
$receipt = $_REQUEST;
if ($receipt == null) {
$receipt = file_get_contents("php://input");
if ($receipt == null) {
$receipt = $GLOBALS['HTTP_RAW_POST_DATA'] ?? file_get_contents("php://input");
}
}
return $receipt;
}
回调接口接收post数据并处理的代码:
libxml_disable_entity_loader(true);
$postStr = $this->post_data();//接收post数据 在这就出问题了,接收到的不是xml下面走不下去
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$arr = $this->object_toarray($postObj);//对象转成数组
ksort($arr);// 对数据进行排序
$str = $this->params_tourl($arr);//对数据拼接成字符串
$user_sign = strtoupper(md5($str));
被折磨好久了,十分不解,来个好兄弟帮忙看看TAT