实现PHP对接微信支付需先理解其JSAPI流程:用户发起请求后,后端调用统一下单接口生成prepay_id,再封装前端支付参数并签名,前端调起支付,最后处理微信异步通知。1. 准备AppID、MCH_ID、API密钥及证书;2. 构造参数调用unifiedorder,按ASCII排序参数生成MD5签名;3. 使用cURL发送XML格式请求;4. 获取prepay_id后生成包含appId、timeStamp、nonceStr、package、signType和paySign的参数返回前端;5. 前端通过WeixinJSBridge.invoke触发支付;6. 微信服务器POST支付结果至notify_url,需解析XML、验证签名并返回success响应;7. 注意金额单位为分、nonce_str随机性、API密钥安全及日志记录。

要实现PHP对接微信支付接口,核心在于理解微信支付的整体流程、参数规范以及签名生成规则。下面从流程到代码细节逐步说明。
微信支付(以JSAPI为例)主要分为以下几个步骤:
在开始编码前,确保你已具备以下信息:
调用https://api.mch.weixin.qq.com/pay/unifiedorder接口前,必须构造正确的参数并生成签名。
立即学习“PHP免费学习笔记(深入)”;
示例代码(使用原生cURL):
function unifiedOrder($openid, $out_trade_no, $total_fee, $body = '商品购买') {
$appid = 'wx8888888888888888';
$mch_id = '1900000109';
$key = 'your_32bit_api_key_1234567890123456'; // API密钥
$notify_url = 'https://yourdomain.com/notify.php';
$params = [
'appid' => $appid,
'mch_id' => $mch_id,
'nonce_str' => md5(uniqid(microtime(true), true)), // 随机字符串
'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
];
// 生成签名
$sign = generateWeChatSign($params, $key);
$params['sign'] = $sign;
// 转为XML格式发送
$xml = arrayToXml($params);
$url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
curl_close($ch);
return xmlToArray($result);
}
微信支付签名采用MD5或HMAC-SHA256算法(默认MD5)。规则如下:
&key=API密钥
签名函数示例:
function generateWeChatSign($params, $key) {
ksort($params); // 按键名升序排列
$stringA = '';
foreach ($params as $k => $v) {
if ($v !== '' && $k != 'sign') {
$stringA .= "{$k}={$v}&";
}
}
$stringA .= "key={$key}";
return strtoupper(md5($stringA));
}
数组转XML工具函数:
function arrayToXml($data) {
$xml = '<xml>';
foreach ($data as $key => $value) {
$xml .= "<{$key}>{$value}</{$key}>";
}
$xml .= '</xml>';
return $xml;
}
function xmlToArray($xml) {
libxml_disable_entity_loader(true);
$arr = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
return $arr;
}
从unifiedorder接口获取prepay_id后,需再次封装用于前端调用的参数,并重新签名。
$result = unifiedOrder($openid, $out_trade_no, $total_fee);
if (isset($result['prepay_id'])) {
$jsApiParams = [
'appId' => $appid,
'timeStamp' => time(),
'nonceStr' => md5(uniqid()),
'package' => 'prepay_id=' . $result['prepay_id'],
'signType' => 'MD5'
];
$jsApiSign = generateWeChatSign($jsApiParams, $key);
$response = [
'appId' => $jsApiParams['appId'],
'timeStamp' => $jsApiParams['timeStamp'],
'nonceStr' => $jsApiParams['nonceStr'],
'package' => $jsApiParams['package'],
'signType' => $jsApiParams['signType'],
'paySign' => $jsApiSign
];
}
将$response返回给前端,用于调用WeixinJSBridge.invoke('getBrandWCPayRequest', ...)。
微信服务器会POST XML 数据到你设置的notify_url,必须正确处理并返回成功响应。
$raw = file_get_contents("php://input");
$data = xmlToArray($raw);
// 验证签名防止伪造
$sign = $data['sign'];
unset($data['sign']);
$local_sign = generateWeChatSign($data, $key);
if ($sign === $local_sign && $data['return_code'] == 'SUCCESS') {
// 处理订单逻辑:更新订单状态、发货等
// 注意:需判断订单是否已处理过,避免重复操作
echo '<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';
} else {
echo '<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[签名失败]]></return_msg></xml>';
}
nonce_str必须随机且不同以上就是php如何实现微信支付接口对接_php微信支付流程与签名生成细节的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号