这段代码的主要功能是实现微信支付的自动续费功能。以下是代码的详细需求说明:
配置信息:首先需要配置一些信息,包括 appid(微信开发平台分配的应用 ID)、secret(应用的密钥)、mch_id(商户号)、key(商户的 API 密钥)和 notify_url(支付成功后通知商户服务器的回调地址)。 订单信息:定义了需要创建的订单信息,包括订单 ID、订单总金额和订单描述。
获取 openid:首先需要获取用户的 openid,用于发起统一下单请求。在这段代码中,使用 code 获取 access_token 和 openid。code 是通过微信登录授权流程获取的,用户在前端页面点击支付按钮后,会跳转到微信登录页面,登录成功后会跳转回来,并附带一个 code 参数。
将这个参数传递给后端,后端通过 code 获取 access_token 和 openid。
统一下单:通过构造请求参数,包括 appid、mch_id、nonce_str、body、out_trade_no、total_fee、spbill_create_ip、notify_url、trade_type 和 openid 等信息,向微信支付接口发起统一下单请求。需要对请求参数进行排序,并生成签名。发送请求后,会返回预支付订单号。
生成 JSAPI 参数:根据预支付订单号生成 JSAPI 参数,包括 appId、timeStamp、nonceStr、package 和 signType。
同样需要对参数进行排序,并生成签名。 返回参数:将生成的 JSAPI 参数返回给前端页面,供前端页面调用微信支付接口。
以下是一个 PHP 实现微信自动续费功能的简单示例代码:
<?php // 配置信息 $appid = 'YOUR_APPID'; $secret = 'YOUR_SECRET'; $mch_id = 'YOUR_MCH_ID'; $key = 'YOUR_KEY'; $notify_url = 'YOUR_NOTIFY_URL'; // 订单信息 $out_trade_no = 'ORDER_ID'; $total_fee = 'TOTAL_FEE'; $body = 'BODY'; // 获取 openid $code = $_GET['code']; $url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=$appid&secret=$secret&code=$code&grant_type=authorization_code"; $response = file_get_contents($url); $access_token = json_decode($response, true)['access_token']; $openid = json_decode($response, true)['openid']; // 统一下单 $data = [ 'appid' => $appid, 'mch_id' => $mch_id, 'nonce_str' => md5(time()), 'body' => $body, 'out_trade_no' => $out_trade_no, 'total_fee' => $total_fee, 'spbill_create_ip' => $_SERVER['REMOTE_ADDR'], 'notify_url' => $notify_url, 'trade_type' => 'JSAPI', 'openid' => $openid, ]; ksort($data); $stringA = urldecode(http_build_query($data)); $stringSignTemp = $stringA . '&key=' . $key; $sign = strtoupper(md5($stringSignTemp)); $data['sign'] = $sign; $xml = "<xml>"; foreach ($data as $key => $value) { $xml .= "<$key><![CDATA[$value]]></$key>"; } $xml .= "</xml>"; $url = 'https://api.mch.weixin.qq.com/pay/unifiedorder'; $options = [ 'http' => [ 'method' => 'POST', 'header' => 'Content-type: application/xml', 'content' => $xml, ], ]; $context = stream_context_create($options); $result = file_get_contents($url, false, $context); $result = simplexml_load_string($result); // 生成 JSAPI 参数 $timestamp = time(); $nonceStr = md5(time()); $data = [ 'appId' => $appid, 'timeStamp' => "$timestamp", 'nonceStr' => $nonceStr, 'package' => "prepay_id={$result->prepay_id}", 'signType' => 'MD5', ]; ksort($data); $stringA = urldecode(http_build_query($data)); $stringSignTemp = $stringA . '&key=' . $key; $sign = strtoupper(md5($stringSignTemp)); $data['paySign'] = $sign; echo json_encode($data); ?>
这段代码实现了以下步骤:
从 URL 参数中获取 code,使用 code 获取用户 openid。
构造统一下单请求参数,生成签名,向微信支付接口发送请求,获取预支付订单号。
构造 JSAPI 参数,生成签名,返回给前端页面。前端页面使用这些参数调起微信支付窗口。
评论