首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 整合支付寶即時到賬接口完整實戰:核心工具類、簽名驗簽、下單與異步通知處理

     編輯:Java 綜合教學

架構概覽

支付寶即時到賬(雙接口)流程:

  1. 商戶系統組裝參數 → 生成表單 HTML → 用戶跳轉支付寶收銀台。
  2. 用戶支付完成 → 支付寶同步跳轉 return_url(頁面提示)+ 異步 POST notify_url(資金確認)。
  3. 商戶 notify_url 驗簽成功 → 更新訂單狀態 → 返回 success。

核心工具類職責

類職責
AlipayConfig單例持有:partner、key、seller_email、notify_url、return_url、簽名方式、輸入編碼
AlipayFunction參數過濾、排序拼接、MD5 簽名、日誌記錄、防釣魚時間戳查詢
Md5EncryptMD5 摘要算法實現(指定 charset)
AlipayService構造業務參數 Map → 過濾簽名 → 生成自動提交 <form> HTML
AlipayNotify異步通知驗證:本地重算簽名 + 遠程 notify_verify 雙重校驗

關鍵代碼片段

簽名流程(核心)

// 1. 過濾空值、sign、sign_type
Map<String,String> filtered = AlipayFunction.ParaFilter(params);
// 2. 按 key 排序拼接 key=val&key=val...
String prestr = AlipayFunction.CreateLinkString(filtered);
// 3. 拼接商戶私鑰
prestr += AlipayConfig.getInstance().key;
// 4. MD5
String sign = Md5Encrypt.md5(prestr);

生成提交表單

StringBuilder sb = new StringBuilder();
sb.append("<form id='alipaysubmit' name='alipaysubmit' action='")
  .append(gateway).append("' method='POST'>");
// 遍歷 filtered 參數生成 hidden input
for (String key : filtered.keySet()) {
    sb.append("<input type='hidden' name='").append(key)
      .append("' value='").append(filtered.get(key)).append("'/>");
}
sb.append("<input type='hidden' name='sign' value='").append(sign).append("'/>");
sb.append("<input type='hidden' name='sign_type' value='MD5'/>");
sb.append("<script>document.forms['alipaysubmit'].submit();</script>");

異步通知處理

public String alipayTrade() {
    // 1. 本地驗簽
    String mySign = AlipayNotify.GetMysign(requestParams, key);
    if (!mySign.equals(requestParams.get("sign"))) return "fail";
    // 2. 遠程驗證 notify_id
    String response = AlipayNotify.Verify(requestParams.get("notify_id"));
    if (!"true".equals(response)) return "fail";
    // 3. 業務判斷
    if ("TRADE_SUCCESS".equals(trade_status) && "T".equals(is_success)) {
        OrderForm order = orderService.findByOutTradeNo(out_trade_no);
        if (order != null && order.getTradeStatus() != 1) {
            order.setTradeStatus(1); order.setTradeNo(trade_no);
            orderService.update(order);
            // 處理子訂單、發貨、積分等...
        }
        return "success"; // 告訴支付寶處理完成
    }
    return "fail";
}

生產環境避坑指南

  1. 金額單位:支付寶以「元」為單位,精確到分,避免浮點數用 BigDecimal。
  2. 幂等性:notify_url 可能重複調用,必須判斷訂單狀態防重複處理。
  3. HTTPS:生產強制 transport=https,防釣魚時間戳需服務器支援 SSL。
  4. 編碼一致:全鏈路 UTF-8,_input_charset、JSP pageEncoding、DB 連接均統一。
  5. 私鑰安全:Key 僅服務端持有,絕不前端暴露;建議升級 RSA2 (SHA256WithRSA) 替代 MD5。
  6. 沙箱測試:先接入支付寶開放平台沙箱環境,驗通再切正式環境。

升級建議

  • 使用官方 SDK (alipay-sdk-java) 替換手工工具類,自動維護簽名、網關、異步驗證邏輯。
  • 遷移至「統一收單交易支付接口」 (alipay.trade.pay) 等新版 API,支援更多支付渠道。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved