承接前文支付頁面展示,第 23 戰聚焦支付核心業務邏輯落地:從前端參數封裝、Service 層簽名加密、到 Struts2 結果跳轉與易寶網關交互,構建完整支付閉環。採用 MVC 分層設計,業務邏輯下沉 Service 層,Action 僅負責參數組裝與流程控制。
依據易寶官方接口文檔定義必填/選填字段,核心屬性包括:
p0_Cmd:業務類型(固定 "Buy")p1_MerId:商戶號p2_Order:商戶訂單號p3_Amt:支付金額p4_Cur:幣種(固定 "CNY")p8_Url:支付成功回調地址pd_FrpId:支付通道編碼(銀行代碼)hmac:簽名(密文)非必填字段(p5_Pid、p6_Pcat、p7_Pdesc)可置空,其餘參數均需傳遞。
public String goBank() {
Forder forder = (Forder) session.get("oldForder");
User user = (User) session.get("user");
model.setP2_Order(forder.getId().toString());
model.setP3_Amt(forder.getTotal().toString());
model.setPa_MP(user.getEmail() + "," + user.getPhone());
payService.saveDataToRequest(request, model); // 委託 Service 處理加密與請求屬性設置
return "pay"; // 跳轉 pay.jsp
}
Action 僅從 Session 獲取訂單與用戶信息,補全前端未傳遞的核心參數,隨後委託 PayService 完成簽名構建與請求屬性注入。
finishSendData)從 Spring @Value 注入配置文件常量:密鑰 key、商戶號 p1_MerId、回調地址 p8_Url。固定字段賦值:p0_Cmd="Buy"、p4_Cur="CNY"、p9_SAF="0"、pr_NeedResponse="0"。
joinSendDataParam)嚴格按易寶文檔規定順序拼接 12 個字段,順序錯誤將導致簽名驗證失敗。
saveDataToRequest)String joinParam = joinSendDataParam(sendData);
request.put("hmac", DigestUtil.hmacSign(joinParam, key)); // MD5 雙重加密生成簽名
// 其餘 11 個明文字段同步放入 request
採用易寶提供的 DigestUtil.hmacSign 實現 HMAC-MD5 加密,確保雙端算法一致。
pay.propertieskey=w0P75wMZ203fr46r5i70V556WHFa94j14yW5J6vuh4yo3nRl5jsqF3c41677
p1_MerId=10000940764
p8_Url=https://www.hao123.com
beans.xml 注入配置<bean id="prop" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="locations">
<array>
<value>classpath:public.properties</value>
<value>classpath:pay.properties</value>
</array>
</property>
</bean>
struts.xml<action name="pay_*" class="payAction" method="{1}">
<result name="pay">/user/pay.jsp</result>
</action>
pay.jsp)頁面渲染訂單號、金額、支付銀行圖標,核心為隱藏表單自動提交至易寶網關:
<form name="yeepay" action='https://www.yeepay.com/app-merchant-proxy/node' method='POST' target="_blank">
<input type='hidden' name='p0_Cmd' value='${requestScope.p0_Cmd}'>
<!-- 其餘 11 個明文字段與 hmac 同理 -->
<input type='hidden' name='hmac' value='${requestScope.hmac}'>
<input type="submit" value="立即支付" />
</form>
易寶收到請求後,按相同算法對明文加密並與 hmac 比對,一致則進入銀行支付頁,不一致則攔截風險請求。此機制保證傳輸數據完整性與防篡改。
引入第三方支付中介,實現「商城專注業務、中介專注通道、銀行專注賬戶」的職責分離。商城僅需維護一套標準接口,屏蔽下游銀行接口差異、升級維護、安全合規等複雜度,大幅降低接入成本與運維風險。