zoukankan      html  css  js  c++  java
  • 微信支付接口--支付成功的回调--超详细Demo

    如果本文对你有用,请爱心点个赞,提高排名,帮助更多的人。谢谢大家!❤

    如果解决不了,可以在文末进群交流。

    如果对你有帮助的话麻烦点个【推荐】~最好还可以follow一下我的GitHub~感谢观看!

    写微信支付成功回调的代码,尤其要注意官方文档的一句话:

    如果不注意这里,支付成功后微信会一直对这个地址进行调用,更新订单的对数据库进行操作,也会一直存在更新: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='<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.

  • 相关阅读:
    输出菱形
    合工大OJ 1359
    9.游标的使用
    8.存储过程和触发器
    css sprite---css精灵网页图片应用处理方式分析
    为什么HTML使用<!DOCTYPE HTML>
    Dom捕捉事件和冒泡事件-原理与demo测试
    html5 canvas 绘制五星红旗
    javascript实现 color颜色格式转换【 rgb和十六进制的转换】
    d3.js 根据需求定制pie图饼图
  • 原文地址:https://www.cnblogs.com/mengyilingjian/p/11699857.html
Copyright © 2011-2022 走看看