微信支付
微信支付是一种在线支付方式,允许用户使用微信钱包在移动应用程序或网站上进行支付。下面是微信支付的详细流程,包括必要的步骤和相关的PHP代码示例。
- 商户向微信支付系统注册并获取商户号和密钥。
- 用户在移动应用程序或网站上选择使用微信支付进行支付。
- 商户根据用户购买的商品或服务生成一个唯一的订单号,同时计算订单的总金额。
- 商户服务器使用下面的PHP代码生成一个包含订单信息的XML请求:
<?php
$nonce_str = uniqid(); // 生成随机字符串
$timestamp = time(); // 当前时间戳
// 构建请求参数数组
$params = array(
'appid' => 'YOUR_APPID', // 商户的APPID
'mch_id' => 'YOUR_MERCHANT_ID', // 商户号
'nonce_str' => $nonce_str, // 随机字符串
'body' => '订单支付', // 商品描述
'out_trade_no' => 'YOUR_ORDER_NUMBER', // 商户订单号
'total_fee' => 100, // 订单总金额(单位:分)
'spbill_create_ip' => $_SERVER['REMOTE_ADDR'], // 用户IP地址
'notify_url' => 'https://yourdomain.com/notify.php', // 支付结果通知地址
'trade_type' => 'APP' // 交易类型
);
// 生成签名
ksort($params); // 按照参数名ASCII码从小到大排序
$stringA = http_build_query($params); // 拼接成URL键值对格式
$stringSignTemp = $stringA . '&key=YOUR_SECRET_KEY'; // 拼接商户密钥
$sign = strtoupper(md5($stringSignTemp)); // 生成签名,转换为大写
// 构建请求XML
$requestXml = "<xml>
<appid>{$params['appid']}</appid>
<body>{$params['body']}</body>
<mch_id>{$params['mch_id']}</mch_id>
<nonce_str>{$params['nonce_str']}</nonce_str>
<notify_url>{$params['notify_url']}</notify_url>
<out_trade_no>{$params['out_trade_no']}</out_trade_no>
<spbill_create_ip>{$params['spbill_create_ip']}</spbill_create_ip>
<total_fee>{$params['total_fee']}</total_fee>
<trade_type>{$params['trade_type']}</trade_type>
<sign>{$sign}</sign>
</xml>";
// 发送请求并获取响应
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.mch.weixin.qq.com/pay/unifiedorder');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $requestXml);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$responseXml = curl_exec($ch);
curl_close($ch);
// 解析响应XML
$responseObj = simplexml_load_string($responseXml, 'SimpleXMLElement', LIBXML_NOCDATA);
$prepayId = $responseObj->prepay_id; // 获取预支付交易会话标识
?>
- 商户服务器从微信支付系统收到响应后,使用预支付交易会话标识(prepay_id)生成一个用于调起微信支付的签名,并将签名和其他必要的参数返回给移动应用程序或网站。
<?php
// 构建调起微信支付的参数数组
$payParams = array(
'appid' => 'YOUR_APPID', // 商户的APPID
'partnerid' => 'YOUR_MERCHANT_ID', // 商户号
'prepayid' => $prepayId, // 预支付交易会话标识
'package' => 'Sign=WXPay', // 扩展字段
'noncestr' => $nonce_str, // 随机字符串
'timestamp' => $timestamp, // 当前时间戳
);
// 生成签名
ksort($payParams); // 按照参数名ASCII码从小到大排序
$stringA = http_build_query($payParams); // 拼接成URL键值对格式
$stringSignTemp = $stringA . '&key=YOUR_SECRET_KEY'; // 拼接商户密钥
$sign = strtoupper(md5($stringSignTemp)); // 生成签名,转换为大写
// 将签名和其他必要的参数返回给移动应用程序或网站
$payParams['sign'] = $sign;
echo json_encode($payParams);
?>
- 移动应用程序或网站使用返回的参数调起微信支付界面。用户确认支付后,微信支付系统会处理支付请求。
- 微信支付系统将支付结果通知商户服务器。商户服务器通过验证通知的签名和订单信息来确保通知的合法性,并处理支付结果。
<?php
// 接收支付结果通知
$xml = file_get_contents('php://input');
$responseObj = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
$sign = $responseObj->sign; // 签名
unset($responseObj->sign); // 移除签名字段
// 验证签名
ksort($responseObj); // 按照参数名ASCII码从小到大排序
$stringA = http_build_query($responseObj); // 拼接成URL键值对格式
$stringSignTemp = $stringA . '&key=YOUR_SECRET_KEY'; // 拼接商户密钥
$generatedSign = strtoupper(md5($stringSignTemp)); // 生成签名,转换为大写
if ($sign === $generatedSign) {
// 验证通过,处理支付结果
$outTradeNo = $responseObj->out_trade_no; // 商户订单号
$transactionId = $responseObj->transaction_id; // 微信支付订单号
// 处理支付结果,更新订单状态等
} else {
// 签名验证失败,可能存在篡改风险
// 忽略或进行其他处理
}
// 返回响应给微信支付系统,通知已接收到支付结果
echo '<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';
?>
这是微信支付的简单流程和相关的PHP代码示例。请注意,示例中的”YOUR_APPID”、”YOUR_MERCHANT_ID”和”YOUR_SECRET_KEY”需要替换为实际的值。此外,还需要根据实际情况处理订单信息和支付结果。
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: