1. 程式人生 > >PHP接收並解析微信支付結果通知

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();
}