微信支付接入遇到的问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yesfeel/article/details/50435173

我们的平台需要需要提供微信支付功能,在接入的过程中遇到了一些问题,现记录下来(以后遇到了再增加),一方面备查,另一方面给遇到同样问题的程序猿们一些解决思路,目前使用到了JSAPI支付和PHP支付接口,总体来说接入比较顺利,不可避免的也踩了一些坑。


1. 设置方面

下面只说容易出问题的地方,基本设置方面请参考手册

微信公众平台>>微信支付>>开发配置 中 “支付授权目录”和“测试授权目录”必须精确到支付页面所在的子目录,且只支持域名,不支持IP;

微信公众平台>>接口权限>>网页账号 中 需要设置授权域名,跟上面开发配置中一致,但只包含域名部分,且不允许IP


2. 微信统一支付PHP接口导致服务器变慢

现象描述:

在接入微信统一支付接口之后,微信中调用创建订单功能,尝试多次之后,服务器对普通请求的响应速度变慢,甚至出现500错误,在重启服务后恢复正常。

问题解决:

该问题经过长时间检查,最终定位到微信接口WxPay.Data.php中WxPayDataBase类的FromXml()方法上,导致问题的代码如下

public function FromXml($xml) {	
    if(!$xml) {
        throw new WxPayException("xml数据异常!");
    }
    //将XML转为array
    //禁止引用外部xml实体
    libxml_disable_entity_loader(true); //这句导致出现上述问题
    $this->values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);		
    return $this->values;
}
改为如下即可解决

public function FromXml($xml) {
    if(!$xml) {
        throw new WxPayException("xml数据异常!");
    }
    //将XML转为array
    //禁止引用外部xml实体
    $disableLibxmlEntityLoader = libxml_disable_entity_loader(true); //改为这句
    $this->values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
    libxml_disable_entity_loader($disableLibxmlEntityLoader); //添加这句
    return $this->values;
}

分析:

libxml_disable_entity_loader()作用是设置是否禁止从外部加载XML实体,设为true就是禁止,目的是防止XML注入攻击(详情自行百度),本意是好的,但这个在设置后存在BUG(具体没深究,以后有时间可以研究下,也许这个BUG在高版本php中已经解决了,没有验证,总之存在这么个BUG,有研究过的朋友可以告诉我原因),影响了服务的正常运行。

对于遇到相同问题的程序猿们,可以尝试此方法来解决。




展开阅读全文

没有更多推荐了,返回首页