如果本文对你有用,请爱心点个赞,提高排名,帮助更多的人。谢谢大家!❤
如果解决不了,可以在文末进群交流。
写微信支付成功回调的代码,尤其要注意官方文档的一句话:
如果不注意这里,支付成功后微信会一直对这个地址进行调用,更新订单的对数据库进行操作,也会一直存在更新:https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=9_7&index=7.
这其实不是坑的主要所在,问题是这个文档,我真的不知道该如何吐槽。一次偶然的意外才看到。这个文档说明。
好了,其他的没有什么需要特别注意的,直接上代码:
?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='xmlreturn_code![CDATA[SUCCESS]]/return_codereturn_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='xmlreturn_code![CDATA[SUCCESS]]/return_codereturn_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.














