请选择 进入手机版 | 继续访问电脑版
设为首页收藏本站

亿仁网

 找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 450|回复: 0

获取通知完成支付

[复制链接]
  • TA的每日心情
    奋斗
    2019-3-14 22:24
  • 签到天数: 160 天

    [LV.7]常住居民III

    1074

    主题

    1139

    帖子

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    18046
    发表于 2017-6-14 11:30:05 | 显示全部楼层 |阅读模式

    支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功(通知频率为15/15/30/180/1800/1800/1800/1800/3600,单位为秒)。

    注意:同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。

    推荐的做法是,当收到通知进行处理时,首先检查对应业务数据的状态,判断该通知是否已经处理过,如果没有处理过再进行处理,如果处理过则直接返回结果成功。在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混乱。特别提醒:商户系统对于支付结果通知的内容一定要做签名验证,防止数据泄露导致出现“假通知”,造成资金损失。

    用户在微信客户端完成支付后(提示已经成功付费),微信会发送给第三方服务器XML格式的数据通知包,在返回的参数中可以看到,用户发送的数据会原样返回,如订单号(out_rade_no)等,用户可以根据此参数值定位到自己系统里面的订单进行处理。同时,也返回了微信交易订单号(transaction_id),可以通过它进行数据正确性的核对。

    在index()方法的统一下单接口中设置的notify_url为:

    http://域名/wxpay/index.php/wechat/pay/wxnotify

    新增wxnotify()方法,增加以下代码:

    1.         // 通知处理
    2.         public function wxnotify()
    3.         {
    4.                 $xml = $GLOBALS['HTTP_RAW_POST_DATA'];
    5.                 if($xml)
    6.                 {
    7.                         // 转换ml数据为数组
    8.                         $result = \WxPayResults::Init($xml);
    9.                         // 写入log日志
    10.                         $data['content'] = 'setup1:'.json_encode($result);
    11.                         M('logs')->add($data);
    12.                         // 订单数据验证
    13.                         $input = new \WxPayOrderQuery();
    14.                         $input->SetTransaction_id($result['transaction_id']);
    15.                         $result = \WxPayApi::orderQuery($input);
    16.                         // 写入log日志
    17.                         $data['content'] = 'setup2:'.json_encode($result);
    18.                         M('logs')->add($data);

    19.                         // 验证是否通过订单验证
    20.                         if(array_key_exists("return_code", $result)
    21.                         && array_key_exists("result_code", $result)
    22.                         && $result["return_code"] == "SUCCESS"
    23.                         && $result["result_code"] == "SUCCESS")
    24.                         {
    25.                                 $data['content'] = 'setup3:'.json_encode(array('info'=>'修改订单状态!'));
    26.                                 M('logs')->add($data);

    27.                                 // 构建回复参数
    28.                                 $return_notify['return_code'] = "SUCCESS";
    29.                                 $return_notify['appid'] = $result['appid'];
    30.                                 $return_notify['nonce_str'] = $result['nonce_str'];
    31.                                 $return_notify['prepay_id'] = $result['prepay_id'];
    32.                                 $return_notify['result_code'] = "SUCCESS";
    33.                                 $return_notify['sign'] = $result['sign'];

    34.                                 // 回复通知
    35.                                 $data = new \WxPayResults();
    36.                                 $data->FromArray($return_notify);
    37.                                 exit($data->ToXml());
    38.                         }
    39.                 }
    40.                 else
    41.                 {
    42.                         exit('FAIL');
    43.                 }
    44.         }
    复制代码

    在数据库中新增db_logs表,数据表仅有id(int4)主键和content(text)两个字段,方便记录接收到的请求信息。

    在方法中,首先,获取微信下发的数据信息(XML格式,POST类型):

    $xml=$GLOBALS['HTTP_RAW_POST_DATA'];

    其次,把XML格式的数据转换为数组类型,并记录到数据库logs表中:

    1.             // 转换ml数据为数组
    2.             $result = \WxPayResults::Init($xml);
    3.             // 写入log日志
    4.             $data['content'] = 'setup1:'.json_encode($result);
    5.             M('logs')->add($data);
    复制代码

    然后,对接收到的数据进行验证:

    1.                         // 订单数据验证
    2.                         $input = new \WxPayOrderQuery();
    3.                         $input->SetTransaction_id($result['transaction_id']);
    4.                         $result = \WxPayApi::orderQuery($input);
    5.                         // 写入log日志
    6.                         $data['content'] = 'setup2:'.json_encode($result);
    7.                         M('logs')->add($data);
    复制代码

    接着,对验证结果进行匹配对比:

    1.                         // 验证是否通过订单验证
    2.                         if(array_key_exists("return_code", $result)
    3.                         && array_key_exists("result_code", $result)
    4.                         && $result["return_code"] == "SUCCESS"
    5.                         && $result["result_code"] == "SUCCESS")
    6.                         {
    7.                                 $data['content'] = 'setup3:'.json_encode(array('info'=>'修改订单状态!'));
    8.                                 M('logs')->add($data);
    9.                         }
    复制代码

    最后,构建响应参数并发送给微信通知接口:

    1.                                 // 构建回复参数
    2.                                 $return_notify['return_code'] = "SUCCESS";
    3.                                 $return_notify['appid'] = $result['appid'];
    4.                                 $return_notify['nonce_str'] = $result['nonce_str'];
    5.                                 $return_notify['prepay_id'] = $result['prepay_id'];
    6.                                 $return_notify['result_code'] = "SUCCESS";
    7.                                 $return_notify['sign'] = $result['sign'];

    8.                                 // 回复通知
    9.                                 $data = new \WxPayResults();
    10.                                 $data->FromArray($return_notify);
    11.                                 exit($data->ToXml());
    复制代码



    造物之前,必先造人。
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|亿仁网 ( 粤ICP备16098737  

    GMT+8, 2021-3-8 10:49 , Processed in 0.066234 second(s), 26 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表