微信小程序中的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."".$key.">"; } $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."".$key.">"; } $xml .= " "; echo $xml; } else { // 支付失败 ... // 返回结果给微信服务器 $result = array( "return_code" => "SUCCESS", "return_msg" => "OK" ); $xml = ""; foreach ($result as $key => $val) { $xml .= "<".$key.">".$val."".$key.">"; } $xml .= " "; echo $xml; }
总结
本文介绍了在微信小程序中使用PHP实现微信支付的前端实现流程及相关代码示例。其中,第一步通过JSAPI获取用户openid,第二步生成预支付订单,第三步调用微信支付API发起支付请求,第四步处理微信支付异步通知。实现微信支付需要前后端协同完成,其中前端主要工作是获取用户信息和调用微信支付API,后端主要工作是生成预支付订单和处理微信支付结果。实现微信支付时需要注意保护商户号、API密钥等私密信息,以提高支付安全性。最后,希望本文对您学习微信支付的前端实现流程有所帮助。