实现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为例)主要分为以下几个步骤:
用户在公众号或小程序中发起支付请求 后端调用统一下单接口(unifiedorder),向微信服务器提交订单信息 微信返回预支付交易会话标识(prepay_id) 后端生成前端可用的支付参数包,并再次签名 前端调起微信支付弹窗完成付款 微信异步通知商户服务器支付结果(回调通知) 商户处理通知并返回success关键配置与准备
在开始编码前,确保你已具备以下信息:
微信公众号AppID(如:wx8888888888888888) 微信商户号MCH_ID(如:1900000109) API密钥(APIv3 Key,在商户平台设置,长度32位) 证书(部分接口如退款需要apiclient_cert.pem和apiclient_key.pem) 服务器已配置好HTTPS和支付授权目录统一下单接口调用与签名生成
调用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);}登录后复制签名生成规则(Sign)
微信支付签名采用MD5或HMAC-SHA256算法(默认MD5)。规则如下:
牛小影 牛小影 - 专业的AI视频画质增强器
420 查看详情
将所有参数按参数名ASCII码从小到大排序(不包括sign字段) 拼接成“key=value”形式,用&连接 最后拼接&key=API密钥 对整个字符串做MD5大写签名函数示例:
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必须随机且不同 API密钥不要泄露,建议配置在非Web目录 生产环境开启SSL证书验证(curl_setopt开启) 回调通知必须校验签名并返回正确XML格式 建议记录日志,便于排查问题基本上就这些,只要遵循微信官方文档参数规范和签名逻辑,PHP对接并不复杂,但细节容易出错。以上就是php如何实现微信支付接口对接_php微信支付流程与签名生成细节的详细内容,更多请关注php中文网其它相关文章!

