PHP接收並解析微信支付結果通知
阿新 • • 發佈:2019-01-11
支付完成後,微信會把相關支付結果和使用者資訊傳送給商戶,商戶需要接收處理,並返回應答。微信通知資訊為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(); }