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

Java 實現微信掃碼支付(Native Pay)完整流程:配置、下單、回調、退款與安全加固

     編輯:Java 綜合教學

微信掃碼支付 Java 版完整接入指南

基於 Spring MVC + Dubbo 架構,僅對外暴露 REST 接口。本文覆蓋商戶配置、統一下單生成二維碼、支付回調處理、退款流程及關鍵安全點。

前置準備

  • 微信支付商戶號:企業主體申請,綁定服務號/小程序。
  • API 密鑰:商戶平台設置,用於簽名驗簽。
  • 證書:apiclient_cert.p12,退款、紅包等接口必須雙向證書校驗。
  • 回調域名:需外網可訪問,配置在商戶平台「開發配置」。

核心配置類 ConfigUtil

public class ConfigUtil {
    public static final String APP_ID = "wx_xxx";          // 服務號 AppID
    public static final String MCH_ID = "1234567890";      // 商戶號
    public static final String API_KEY = "xxxxxxxxxxxx";   // API 密鑰
    public static final String CERT_PATH = "/path/apiclient_cert.p12";
    public static final String NOTIFY_URL = "https://api.yourdomain.com/weixin/pay/notify";
    public static final String UNIFIED_ORDER_URL = "https://api.mch.weixin.qq.com/pay/unifiedorder";
    // ... 其他接口 URL

    public static void commonParams(SortedMap<Object, Object> params) {
        params.put("appid", APP_ID);
        params.put("mch_id", MCH_ID);
        params.put("nonce_str", generateNonceStr()); // 隨機字符串
    }
}

掃碼支付模式二:統一下單生成 code_url

  1. 組裝參數:trade_type=NATIVE、product_id(商品 ID)、notify_url、body、out_trade_no(商户訂單號)、total_fee(分)等。
  2. 按鍵值排序拼接字符串,HMAC-SHA256 簽名,轉 XML。
  3. HTTPS POST 請求 unifiedorder 接口。
  4. 解析響應 XML,提取 code_url,前端生成二維碼供用戶掃碼。

關鍵點:code_url 格式為 weixin://wxpay/bizpayurl?sr=xxxxx,可直接生成 QR 碼;也可調用 shorturl 接口轉短鏈接提升掃描速度。

支付回調處理

@Controller
@RequestMapping("/weixin")
public class WeixinPayController {
    @Autowired private IWeixinPayService weixinPayService;

    @RequestMapping("/pay/notify")
    public void notify(HttpServletRequest request, HttpServletResponse response) throws Exception {
        // 1. 讀取輸入流,轉字符串
        String xml = IOUtils.toString(request.getInputStream(), "UTF-8");
        // 2. XML 轉 Map
        Map<String, String> map = XMLUtil.parse(xml);
        // 3. 簽名驗證
        if (!PayCommonUtil.verifySign(map, ConfigUtil.API_KEY)) {
            log.error("簽名驗證失敗");
            return;
        }
        // 4. 判斷業務結果
        if ("SUCCESS".equals(map.get("result_code"))) {
            String outTradeNo = map.get("out_trade_no");
            String attach = map.get("attach"); // 附加數據,可存業務標識
            // 業務處理:更新訂單狀態、發貨、發券等
            weixinPayService.handleSuccess(outTradeNo, attach);
            // 5. 應答微信:必須返回 SUCCESS,否則微信會重試通知(共 8 次)
            response.getWriter().write("");
        } else {
            log.warn("支付失敗: " + map.get("err_code_des"));
            response.getWriter().write("");
        }
    }
}

安全加固清單

  1. 簽名驗證:回調、主動查單、退款查詢等所有涉錢接口必驗簽。
  2. 幂等性:回調可能重複,基于 out_trade_no + transaction_id 去重處理。
  3. 金額校驗:回調中核對 total_fee 與訂單金額一致。
  4. 證書保護:.p12 文件嚴禁提交代碼倉庫,運行時從加密配置中心/密管平台加載。
  5. 敏感信息脫敏:日誌不打印完整卡號、openid、API_KEY 等。
  6. IP 白名單:服務器防火牆限制只允許微信回調 IP 段訪問回調端口。

常見坑點

  • total_fee 單位是「分」,易漏乘 100。
  • 回調未在 5 秒內返回 SUCCESS,微信判定失敗並重試。
  • 測試環境需配置內網穿透或公網域名,本地 localhost 無法接收回調。
  • 沙箱環境與正式環境 AppID、MCH_ID、API_KEY 完全隔離,切勿混用。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved