授人以魚不如授人以漁。本文以 PHP 為例,系統梳理微信支付(V2/JSAPI & NATIVE 模式)的核心開發步驟,涵蓋參數組裝、簽名算法、統一下單、前端喚起、異步通知驗證等關鍵環節,助你快速落地。
https://api.mch.weixin.qq.com/pay/unifiedorder,獲取 prepay_id 或 code_url。jsApi 參數;NATIVE 轉二維碼展示。| 參數 | 說明 | 備註 |
|---|---|---|
| appid | 公眾號/小程序 ID | 微信開放平台申請 |
| mch_id | 商戶號 | 商戶平台獲取 |
| body | 商品簡述 | 127 字節內 |
| out_trade_no | 商戶訂單號 | 唯一,建議含時間戳 |
| total_fee | 訂單金額(分) | 注意單位轉換 |
| trade_type | 交易類型 | JSAPI(公眾號/小程序) / NATIVE(掃碼) |
| openid | 用戶標識 | JSAPI 必填 |
| notify_url | 異步通知地址 | 需外網可訪問 |
| nonce_str | 32 位隨機串 | 防重放攻擊 |
| spbill_create_ip | 終端 IP | 服務器公網 IP |
<?php
function makeSign(array $params, string $apiKey): string {
// 1. 除去 sign 參數
unset($params['sign']);
// 2. 字典序排序(鍵值 A-Z)
ksort($params);
// 3. 拼接字符串 k1=v1&k2=v2...
$stringA = urldecode(http_build_query($params));
// 4. 拼接商戶金鑰
$stringSignTemp = $stringA . "&key=" . $apiKey;
// 5. MD5 加密並轉大寫
return strtoupper(md5($stringSignTemp));
}
?>
避坑提醒: sign 參數本身不參與簽名;apiKey 為商戶平台自行設置的 32 位金鑰,切勿硬編碼在代碼中。
將簽名後的數組轉為 XML,使用 cURL POST 發送。響應 XML 示例:
<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<result_code><![CDATA[SUCCESS]]></result_code>
<prepay_id><![CDATA[wx201411101639507cbf6ffd8b0779950874]]></prepay_id>
<trade_type><![CDATA[JSAPI]]></trade_type>
<code_url><![CDATA[weixin://wxpay/bizpayurl?pr=xxxxx]]></code_url> <!-- NATIVE 專有 -->
</xml>
二次簽名生成 paySign,參數鍵名區分大小寫(appId、timeStamp、nonceStr、package、signType),最終 json_encode 傳給 WeixinJSBridge.invoke('getBrandWCPayRequest', ...)。
<?php
// 1. 獲取原始 XML
$xml = file_get_contents('php://input');
$arr = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
// 2. 取出並移除 sign
$recvSign = $arr['sign'];
unset($arr['sign']);
// 3. 本地重新計算簽名
$localSign = makeSign($arr, $apiKey);
// 4. 比對並處理業務
if ($recvSign === $localSign && $arr['result_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>';
}
?>
*100。appId ≠ appid)。sslcert/sslkey。掌握上述流程與細節,即可在 PHP 項目中穩健接入微信支付。建議配合官方 微信支付開發文檔 同步閱讀,隨時跟進接口變更。