首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

微信支付開發全流程詳解(PHP 版):從下單到回調的完整實現指南

     編輯:PHP 相關知識

微信支付開發全流程詳解(PHP 版)

授人以魚不如授人以漁。本文以 PHP 為例,系統梳理微信支付(V2/JSAPI & NATIVE 模式)的核心開發步驟,涵蓋參數組裝、簽名算法、統一下單、前端喚起、異步通知驗證等關鍵環節,助你快速落地。

核心業務流程圖解

  1. 獲取訂單信息:收集商品描述、訂單號、金額(單位:分)。
  2. 生成簽名與支付參數:按微信規範簽名,組裝 XML 請求體。
  3. 統一下單請求:POST 至 https://api.mch.weixin.qq.com/pay/unifiedorder,獲取 prepay_id 或 code_url。
  4. 前端喚起支付:JSAPI 生成 jsApi 參數;NATIVE 轉二維碼展示。
  5. 異步回調處理:驗證簽名、更新訂單狀態、回應微信確認單。

關鍵參數清單

參數說明備註
appid公眾號/小程序 ID微信開放平台申請
mch_id商戶號商戶平台獲取
body商品簡述127 字節內
out_trade_no商戶訂單號唯一,建議含時間戳
total_fee訂單金額(分)注意單位轉換
trade_type交易類型JSAPI(公眾號/小程序) / NATIVE(掃碼)
openid用戶標識JSAPI 必填
notify_url異步通知地址需外網可訪問
nonce_str32 位隨機串防重放攻擊
spbill_create_ip終端 IP服務器公網 IP

簽名算法(MD5)核心步驟

<?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>

前端喚起支付(JSAPI)

二次簽名生成 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。
  • 簽名大小寫:JSAPI 參數鍵名嚴格區分大小寫(appId ≠ appid)。
  • 回調冪等性:微信可能多次推送,業務邏輯需判斷訂單狀態防重複處理。
  • 證書雙向驗證:退款、紅包等高級接口需配置 sslcert/sslkey。

掌握上述流程與細節,即可在 PHP 項目中穩健接入微信支付。建議配合官方 微信支付開發文檔 同步閱讀,隨時跟進接口變更。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved