c语言编程笔录

首页 >   > 笔记大全

笔记大全

微信小程序中的PHP微信支付前端实现流程

更新时间:2023-12-07

前言

微信支付是微信生态系统中非常重要的一部分,它包含了微信支付的开发框架,API以及后台管理等多个方面。实现微信支付的方式多样,其中PHP实现微信支付在Web应用程序中非常广泛。本文将介绍使用PHP在微信小程序中实现微信支付的前端实现流程及相关代码示例。

第一步:调用JSAPI获取用户openid

在微信小程序中实现微信支付流程的第一步是获取用户openid,使用JSAPI调用wx.login方法获取code,将code发送到后端服务器,后端服务器通过调用微信API获取openid,并将其返回给前端。

    // 前端代码
    wx.login({
      success: function (res) {
        if (res.code) {
          wx.request({
            url:'https://example.com/getOpenid.php',
            data: {
              code: res.code
            },
            success: function (res) {
              console.log(res.data);
              // 在这里处理后端返回的openid
            }
          })
        } else {
          console.log('登录失败!' + res.errMsg)
        }
      }
    });
    // getOpenid.php代码
    $appid = "wxXXXXXXXXXXXXXXXX";  // 微信小程序的appid
    $secret = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";    // 微信小程序的app secret
    $code = $_GET["code"];
    $url = "https://api.weixin.qq.com/sns/jscode2session?appid=$appid&secret=$secret&js_code=$code&grant_type=authorization_code";
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    $result = curl_exec($ch);
    curl_close($ch);
    echo $result;

第二步:生成预支付订单

获取到用户openid后,将其发送给后端服务器,后端服务器通过调用微信支付API生成预支付订单,再将订单信息返回给前端。

    // 前端代码
    wx.request({
      url:'https://example.com/prepay.php',
      data: {
        openid: openid,
        amount: amount
      },
      success: function (res) {
        console.log(res.data);
        // 在这里处理后端返回的预支付订单信息
      }
    });
    // prepay.php代码
    $appid = "wxXXXXXXXXXXXXXXXX";  // 微信小程序的appid
    $mch_id = "XXXXXXXXX";  // 商户号
    $nonce_str = uniqid();    // 随机字符串
    $body = "测试购买商品";    // 商品描述
    $out_trade_no = uniqid();  // 商户订单号
    $total_fee = $_GET["amount"];    // 订单总金额,单位为分
    $spbill_create_ip = $_SERVER["REMOTE_ADDR"]; // 用户客户端IP地址
    $notify_url = "https://example.com/notify.php";    // 接收微信支付异步通知回调地址
    $trade_type = "JSAPI";  // 交易类型
    $openid = $_GET["openid"];
    
    // 构造请求参数数组
    $params = array(
      "appid" => $appid,
      "mch_id" => $mch_id,
      "nonce_str" => $nonce_str,
      "body" => $body,
      "out_trade_no" => $out_trade_no,
      "total_fee" => $total_fee,
      "spbill_create_ip" => $spbill_create_ip,
      "notify_url" => $notify_url,
      "trade_type" => $trade_type,
      "openid" => $openid
    );
    
    // 生成签名
    ksort($params);
    $string = http_build_query($params);
    $string = urldecode($string);
    $string .= "&key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";   // 微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置
    $sign = strtoupper(md5($string));
    $params["sign"] = $sign;

    // 构造请求XML
    $xml = "";
    foreach ($params as $key => $value) {
      $xml .= "<".$key.">".$value."";
    }
    $xml .= "";

    // 发起HTTP请求
    $url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,false);
    $result = curl_exec($ch);
    curl_close($ch);

    // 解析响应XML
    $xml = simplexml_load_string($result);
    $json = json_encode($xml);
    echo $json;

第三步:调用微信支付API发起支付请求

获取到预支付订单信息后,将其发送给后端服务器,后端服务器根据订单信息生成微信支付API所需的参数(签名等),并通过调用微信支付API发起支付请求。将微信支付API返回的参数传递给前端。

    // 前端代码
    wx.request({
      url:'https://example.com/pay.php',
      data: {
        prepay_id: prepay_id
      },
      success: function (res) {
        console.log(res.data);
        // 在这里调起微信支付API
      }
    });
    // pay.php代码
    $appid = "wxXXXXXXXXXXXXXXXX";  // 微信小程序的appid
    $mch_id = "XXXXXXXXX";  // 商户号
    $nonce_str = uniqid();    // 随机字符串
    $prepay_id = $_GET["prepay_id"];  // 预支付订单号
    
    // 构造请求参数数组
    $params = array(
      "appId" => $appid,
      "timeStamp" => time(),
      "nonceStr" => $nonce_str,
      "package" => "prepay_id=".$prepay_id,
      "signType" => "MD5"
    );
    
    // 生成签名
    ksort($params);
    $string = http_build_query($params);
    $string = urldecode($string);
    $string .= "&key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";   // 微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置
    $sign = strtoupper(md5($string));
    $params["paySign"] = $sign;

    // 返回结果
    echo json_encode($params);

第四步:处理微信支付异步通知

当用户完成支付后,微信服务器将向预先设置的异步通知回调地址发送支付结果,后端服务器接收到回调请求后处理支付结果。处理结果需要向微信服务器返回结果,以保证微信服务器确认收到了支付结果通知。

    // notify.php代码
    $xml = file_get_contents("php://input");
    $xml = simplexml_load_string($xml);
    $json = json_encode($xml);
    $data = json_decode($json, true);

    $appid = $data["appid"];              // 商户appid
    $mch_id = $data["mch_id"];            // 商户号
    $result_code = $data["result_code"];  // 支付结果
    if ($result_code == "SUCCESS") {
      // 支付成功
      $out_trade_no = $data["out_trade_no"];  // 商户订单号
      // 处理订单逻辑
      ...
      // 返回结果给微信服务器
      $result = array(
        "return_code" => "SUCCESS",
        "return_msg" => "OK"
      );
      $xml = "";
      foreach ($result as $key => $val) {
        $xml .= "<".$key.">".$val."";
      }
      $xml .= "";
      echo $xml;
    } else {
      // 支付失败
      ...
      // 返回结果给微信服务器
      $result = array(
        "return_code" => "SUCCESS",
        "return_msg" => "OK"
      );
      $xml = "";
      foreach ($result as $key => $val) {
        $xml .= "<".$key.">".$val."";
      }
      $xml .= "";
      echo $xml;
    }

总结

本文介绍了在微信小程序中使用PHP实现微信支付的前端实现流程及相关代码示例。其中,第一步通过JSAPI获取用户openid,第二步生成预支付订单,第三步调用微信支付API发起支付请求,第四步处理微信支付异步通知。实现微信支付需要前后端协同完成,其中前端主要工作是获取用户信息和调用微信支付API,后端主要工作是生成预支付订单和处理微信支付结果。实现微信支付时需要注意保护商户号、API密钥等私密信息,以提高支付安全性。最后,希望本文对您学习微信支付的前端实现流程有所帮助。