PHP接收并解析微信支付结果通知

支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。微信通知信息为xml格式。

信息格式大致如下:

<xml><appid><![CDATA[wx65498522b9a7pokr]]></appid>
<bank_type><![CDATA[CFT]]></bank_type>
<cash_fee><![CDATA[1]]></cash_fee>
<fee_type><![CDATA[CNY]]></fee_type>
<is_subscribe><![CDATA[N]]></is_subscribe>
<mch_id><![CDATA[1238752902]]></mch_id>
<nonce_str><![CDATA[103v4ohia9x8zcmpgted7mhln96d7ouy]]></nonce_str>
<openid><![CDATA[o1FbXsuU0L3PhQaR0FH6eAwLMDc0]]></openid>
<out_trade_no><![CDATA[2222]]></out_trade_no>
<result_code><![CDATA[SUCCESS]]></result_code>
<return_code><![CDATA[SUCCESS]]></return_code>
<sign><![CDATA[DF81D51082E2039B5EC7E6C3B47461F2]]></sign>
<time_end><![CDATA[20161228092403]]></time_end>
<total_fee>1</total_fee>
<trade_type><![CDATA[NATIVE]]></trade_type>
<transaction_id><![CDATA[4005212001201612284235706302]]></transaction_id>
</xml>

php可使用如下方法接收信息:

$xmlData = file_get_contents('php://input');

解析方法如下:

libxml_disable_entity_loader(true);
$data = json_decode(json_encode(simplexml_load_string($xmlData, 'SimpleXMLElement', LIBXML_NOCDATA)), true);

对于支付结果通知的内容一定要做签名验证,防止数据泄漏导致出现“假通知”,造成资金损失。签名验证方法如下:

ksort($data);
$buff = '';
foreach ($data as $k => $v){
    if($k != 'sign'){
        $buff .= $k . '=' . $v . '&';
    }
}
$stringSignTemp = $buff . 'key=192006250b4c09247ec02edce69f6a2d';//key为证书密钥
$sign = strtoupper(md5($stringSignTemp));
//判断算出的签名和通知信息的签名是否一致
if($sign == $data['sign']){
    //处理完成之后,告诉微信成功结果
    echo '<xml>
              <return_code><![CDATA[SUCCESS]]></return_code>
              <return_msg><![CDATA[OK]]></return_msg>
          </xml>';
    exit();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值