美文网首页
PHP微信支付开发(3)-订单查询

PHP微信支付开发(3)-订单查询

作者: 极客开发者 | 来源:发表于2020-10-27 09:17 被阅读0次

    一、概述

    本系列博客将讨论基于微信支付的项目开发中,涉及到的下单与支付、退款、以及订单查询的后端代码实现。在本系列博客中,将以代码片段作为示例,来讨论ThinkPHP 后端接口实现的过程。

    在本系列的接口示例中,返回的状态码标识如下:

    0: 业务成功
    -1: 业务失败
    

    开发环境如果:

    • ThinkPHP 6 或者 ThinkPHP 5 / 5.1
    • PHP 7 运行环境

    本文是第三篇,我们先讨论订单查询。

    订单查询接口是用于查询订单状态的,当用户支付成功之后,或者退款成功之后,微信服务器可能没有及时完成通知(这种概率很小)。我们可以设置订单查询接口给前段调用来更新业务的订单状态,及时完成订单状态的更新。

    二、请求查询接口

    //根据客户端传过来的业务订单id,获取到业务订单对象
    $order = Orders::where('id',request()->params('id'))->find();
    if (!$order) {
        return json(['code':-1,'msg':'订单不存在']);
    }
    //构造请求微信接口的参数
    $params = [
        'appid' => config('wx.app_id'),// APP ID
        'mch_id' => config('wx.mch_id'),// 商户号
        'out_trade_no' => $order['out_trade_no'],
        'nonce_str' => md5(time()),
        'sign_type' => 'MD5',
    ];
    //构造xml
    $xml = '<?xml version="1.0" encoding="utf-8"?>';
    $xml .= '<xml>';
    $stringA = '';
    ksort($params);
    foreach ($params as $key => $value) {
        $stringA .= $key . '=' . $value . '&';
        $xml .= '<' . $key . '>' . $value . '</' . $key . '>';
    }
    $signTmp = $stringA . 'key=' . config('wx.mch_key');//拼接商户号
    $sign = strtoupper(md5($signTmp));//签名后的32位字符
    //将签名添加到xml中
    $xml .= '<sign>' . $sign . '</sign>';
    $xml .= '</xml>';
    

    构造好参数之后,发送请求

    //发起https请求
    $url = 'https://api.mch.weixin.qq.com/pay/orderquery';
    $res_xml = order_request($url, $xml);
    $simpleXMLElement = simplexml_load_string($res_xml, 'SimpleXMLElement', LIBXML_NOCDATA);
    //将SimpleXMLElement对象转为数组
    $jsonStr = json_encode($simpleXMLElement);
    $jsonArray = json_decode($jsonStr, true);
    

    如果订单已经支付,更新为已支付状态,如果订单已退款,更新为退款状态

    //更新订单状态
    if (strval($jsonArray['return_code']) === 'SUCCESS') {
        if (strval($jsonArray['trade_state']) === 'SUCCESS') {
            if ($order['status'] !== 1) {
                // 支付成功
                $order['status'] = 1;
                $order['transaction_id'] = $jsonArray['transaction_id'];
            }
        } elseif (strval($jsonArray['trade_state']) === 'REFUND') {
            if ($order['status'] !== 3) {
                // 退款成功
                $order['status'] = 3;
                $order['transaction_id'] = $jsonArray['transaction_id'];
            }
        }
        $order->save();
    }
    

    相关文章

      网友评论

          本文标题:PHP微信支付开发(3)-订单查询

          本文链接:https://www.haomeiwen.com/subject/yhevmktx.html