微信支付

微信支付是一种在线支付方式,允许用户使用微信钱包在移动应用程序或网站上进行支付。下面是微信支付的详细流程,包括必要的步骤和相关的PHP代码示例。

  1. 商户向微信支付系统注册并获取商户号和密钥。
  2. 用户在移动应用程序或网站上选择使用微信支付进行支付。
  3. 商户根据用户购买的商品或服务生成一个唯一的订单号,同时计算订单的总金额。
  4. 商户服务器使用下面的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; // 获取预支付交易会话标识
?>
  1. 商户服务器从微信支付系统收到响应后,使用预支付交易会话标识(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);
?>
  1. 移动应用程序或网站使用返回的参数调起微信支付界面。用户确认支付后,微信支付系统会处理支付请求。
  2. 微信支付系统将支付结果通知商户服务器。商户服务器通过验证通知的签名和订单信息来确保通知的合法性,并处理支付结果。
<?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 协议》,转载必须注明作者和本文链接
写这些文章的初衷只是记录一下自己的学习过程,避免自己忘记
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!