微信支付介面--支付成功的回撥--超詳細Demo
阿新 • • 發佈:2019-01-30
寫微信支付成功回撥的程式碼,尤其要注意官方文件的一句話:
這其實不是坑的主要所在,問題是這個文件,我真的不知道該如何吐槽。一次偶然的意外才看到。這個文件說明。
好了,其他的沒有什麼需要特別注意的,直接上程式碼:
<?php //獲取介面資料,如果$_REQUEST拿不到資料,則使用file_get_contents函式獲取 $post = $_REQUEST; if ($post == null) { $post = file_get_contents("php://input"); } if ($post == null) { $post = isset($GLOBALS['HTTP_RAW_POST_DATA']) ? $GLOBALS['HTTP_RAW_POST_DATA'] : ''; } if (empty($post) || $post == null || $post == '') { //阻止微信介面反覆回撥介面 文件地址 https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=9_7&index=7,下面這句非常重要!!! $str='<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>'; echo $str; exit('Notify 非法回撥'); } /*****************微信回撥返回資料樣例******************* $post = '<xml> <return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[OK]]></return_msg> <appid><![CDATA[wx2421b1c4370ec43b]]></appid> <mch_id><![CDATA[10000100]]></mch_id> <nonce_str><![CDATA[IITRi8Iabbblz1Jc]]></nonce_str> <sign><![CDATA[7921E432F65EB8ED0CE9755F0E86D72F]]></sign> <result_code><![CDATA[SUCCESS]]></result_code> <prepay_id><![CDATA[wx201411101639507cbf6ffd8b0779950874]]></prepay_id> <trade_type><![CDATA[APP]]></trade_type> </xml>'; *************************微信回撥返回*****************/ libxml_disable_entity_loader(true); //禁止引用外部xml實體 $xml = simplexml_load_string($post, 'SimpleXMLElement', LIBXML_NOCDATA);//XML轉陣列 $post_data = (array)$xml; /** 解析出來的陣列 *Array * ( * [appid] => wx1c870c0145984d30 * [bank_type] => CFT * [cash_fee] => 100 * [fee_type] => CNY * [is_subscribe] => N * [mch_id] => 1297210301 * [nonce_str] => gkq1x5fxejqo5lz5eua50gg4c4la18vy * [openid] => olSGW5BBvfep9UhlU40VFIQlcvZ0 * [out_trade_no] => fangchan_588796 * [result_code] => SUCCESS * [return_code] => SUCCESS * [sign] => F6890323B0A6A3765510D152D9420EAC * [time_end] => 20180626170839 * [total_fee] => 100 * [trade_type] => JSAPI * [transaction_id] => 4200000134201806265483331660 * ) **/ //訂單號 $out_trade_no = isset($post_data['out_trade_no']) && !empty($post_data['out_trade_no']) ? $post_data['out_trade_no'] : 0; //查詢訂單資訊 $order_info = DB::fetch_first("SELECT * FROM order WHERE order_no = '" .$out_trade_no."'"); if(count($order_info) > 0){ //查詢平臺資訊 $platform_info = DB::fetch_first("SELECT * FROM pingtaiInfo WHERE `open_pid`= {$order_info['part1']}"); //平臺支付key $wxpay_key = $platform_info['zhifu_key']; //接收到的簽名 $post_sign = $post_data['sign']; unset($post_data['sign']); //重新生成簽名 $newSign = MakeSign($post_data,$wxpay_key); //簽名統一,則更新資料庫 if($post_sign == $newSign){ $updateData = array(); $updateData['pay_time'] = TIMESTAMP; //支付時間 $updateData['order_status'] = 2; //訂單狀態 //更新order資料庫 //Do what you want... } } //阻止微信介面反覆回撥介面 文件地址 https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=9_7&index=7,下面這句非常重要!!! $str='<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>'; echo $str; function MakeSign($params,$key){ //簽名步驟一:按字典序排序陣列引數 ksort($params); $string = ToUrlParams($params); //引數進行拼接key=value&k=v //簽名步驟二:在string後加入KEY $string = $string . "&key=".$key; //簽名步驟三:MD5加密 $string = md5($string); //簽名步驟四:所有字元轉為大寫 $result = strtoupper($string); return $result; } function ToUrlParams( $params ){ $string = ''; if( !empty($params) ){ $array = array(); foreach( $params as $key => $value ){ $array[] = $key.'='.$value; } $string = implode("&",$array); } return $string; }
廢話不多說了,直接上程式碼,不懂地方可留言,或者進微信群內交流。群二維碼如果過期,請加我微信:mengyilingjian.