一、前言
本案例使用的是Java實現的。使用支付寶的沙盒環境示例。發布需要換成正式環境。這里就不作詳細說明了
本代碼適合用來做參考,不要直接復制去使用。
沒有賬號的需要去平台注冊一個:
登錄支付寶開發平台 -->開發接入 鏈接:https://open.alipay.com/platform/home.htm 如下圖
找到開發服務中的沙箱 點擊查看沙箱開發的流程 進入到沙箱環境中 配置相應的信息
https://openhome.alipay.com/platform/appDaily.htm
然后進入 https://docs.open.alipay.com/291/105971 下載支付寶官方的 簽名驗簽工具
點擊左邊的 生成密鑰, 密鑰長度選擇 RSA2 密鑰格式選擇PKCS8 因為我們使用的是Java開發
然后點擊生成密鑰
然后復制應用公鑰 上傳到沙盒環境中 應用私鑰 需要自己保存下來,后面有用到噢;
支付寶的東西已經准備好了現在我們開始寫代碼
二、Java代碼實現
本案例使用的是Maven項目
首先我們導入支付寶的 alipay-sdk-java
<dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-sdk-java</artifactId> <version>3.0.0</version> </dependency>
(1)編寫支付寶配置文件
package cn.xtyos.project.system.czzx.config; /** * TODO 支付寶配置文件 * * @author James * @date 2020/2/9 20:15 */ public class AliPayConfig { //應用ID,您的APPID,收款賬號既是您的APPID對應支付寶賬號 public static String APP_ID="2018121562XXXXX"; //商戶私鑰,您的PKCS8格式RSA2私鑰 public static String MERCHANT_PRIVATE_KEY="MIIEvQIBADANxxxxxxxxxxxxx"; //支付寶公鑰,查看地址:https://openhome.alipay.com/platform/keyManage.htm 對應APPID下的支付寶公鑰。 public static String ALIPAY_PUBLIC_KEY="MIIBIjANBgkqhkiGxxxxxxxxxxxxxxxxx"; //服務器異步通知頁面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數,必須外網可以正常訪問 public static String NOTIFY_URL="http://127.0.0.1:8089/alipay/notify"; //頁面跳轉同步通知頁面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數,必須外網可以正常訪問 public static String RETURN_URL="http://127.0.0.1:8089/alipay/return"; //簽名方式 public static String SIGN_TYPE="RSA2"; //字符編碼格式 public static String CHARSET="utf-8"; //支付寶網關(沙盒環境) public static String GATEWAY_URL="https://openapi.alipaydev.com/gateway.do"; }
(2)HTML頁面代碼
<div class="panel-body"> <form id="dgabksghbrdx" class="form-horizontal" action="/chbManager/chb/pay" method="post" target="_blank"> <div class="form-group"> <label class="col-sm-3 control-label">彩虹幣:</label> <div class="col-sm-8"> <input type="text" id="chb" name="chb" placeholder="彩虹幣" class="form-control"> <label>彩虹幣匯率: 1 元 = 10 彩虹幣</label> </div> </div> <div class="form-group"> <label class="col-sm-3 control-label">合計金額:</label> <div class="col-sm-8"> <input id="heji" name="heji" type="text" placeholder="合計金額" class="form-control" readonly="readonly"> </div> </div> <div class="form-group"> <label class="col-sm-3 control-label">支付方式:</label> <div class="col-sm-8"> <label> <input type="radio" checked="" value="alipay" id="optionsRadios1" name="payMethod">支付寶</label> </div> </div> <div class="form-group"> <div class="col-sm-offset-3 col-sm-8"> <button id="submit" class="btn btn-sm btn-white btn-success" type="submit">支 付</button> </div> </div> </form> </div>
(3)發起支付請求
public static String pay(Map<String,Object> hap) throws Exception { //獲取要向支付寶支付的參數,由頁面傳過來 //商戶訂單號,商戶網站訂單系統中唯一訂單號,必填 String out_trade_no = StringUtil.getStr(hap.get("WIDout_trade_no")); //付款金額,必填 String total_amount = StringUtil.getStr(hap.get("WIDtotal_amount")); //訂單名稱,必填 String subject = StringUtil.getStr(hap.get("WIDsubject")); //商品描述,可空 String body = StringUtil.getStr(hap.get("WIDbody")); //獲得初始化的AlipayClient AlipayClient alipayClient = new DefaultAlipayClient(AliPayConfig.GATEWAY_URL, AliPayConfig.APP_ID, AliPayConfig.MERCHANT_PRIVATE_KEY, "json", AliPayConfig.CHARSET, AliPayConfig.ALIPAY_PUBLIC_KEY, AliPayConfig.SIGN_TYPE); //設置請求參數 AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest(); alipayRequest.setReturnUrl(AliPayConfig.RETURN_URL); //設置同步回調通知 alipayRequest.setNotifyUrl(AliPayConfig.NOTIFY_URL); //設置異步回調通知 //設置支付參數 alipayRequest.setBizContent("{\"out_trade_no\":\"" + out_trade_no + "\"," + "\"total_amount\":\"" + total_amount + "\"," + "\"subject\":\"" + subject + "\"," + "\"body\":\"" + body + "\"," + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}"); //請求 String result = null; try { result = alipayClient.pageExecute(alipayRequest).getBody(); } catch (AlipayApiException e) { // TODO Auto-generated catch block e.printStackTrace(); } return result; }
(4)支付后的同步通知和異步通知
@RequestMapping("/notify") public String pay_notify(HttpServletRequest request) { System.out.println("支付完成進入異步通知"); String out_trade_no= paramsMap.get("out_trade_no"); String trade_status= paramsMap.get("trade_status"); try { boolean signVerified = AlipaySignature.rsaCheckV1(paramsMap, AliPayConfig.ALIPAY_PUBLIC_KEY, AliPayConfig.CHARSET, AliPayConfig.SIGN_TYPE); //無論同步異步都要驗證簽名 if(signVerified){ if(trade_status.equals("TRADE_FINISHED") || trade_status.equals("TRADE_SUCCESS")){ //處理自己系統的業務邏輯,如:將支付記錄狀態改為成功,需要返回一個字符串success告知支付寶服務器 return "異步 success"; } else { //支付失敗不處理業務邏輯 return "failure"; } }else { //簽名驗證失敗不處理業務邏輯 return "failure"; } } catch (AlipayApiException e) { e.printStackTrace(); return "failure"; } } @RequestMapping("/return") @ResponseBody public String pay_return(HttpServletRequest request) { Map<String, String> paramsMap = convertRequestParamsToMap(request); try { boolean signVerified = AlipaySignature.rsaCheckV1(paramsMap, AliPayConfig.ALIPAY_PUBLIC_KEY, AliPayConfig.CHARSET, AliPayConfig.SIGN_TYPE); if(signVerified){ //跳轉支付成功界面 return "支付成功頁面"; }else { //跳轉支付失敗界面 return "failure"; } } catch (AlipayApiException e) { e.printStackTrace(); } return "success 同步"; }

個人網站:
http://www.xtyos.cn
github: https://github.com/2629180692
博客園: http://www.cnblogs.com/wurendao
完成日期 ©2020-02-10 無人島
遇到什么問題歡迎到下面評論里提出或者聯系我哦!
github: https://github.com/2629180692
博客園: http://www.cnblogs.com/wurendao
完成日期 ©2020-02-10 無人島
遇到什么問題歡迎到下面評論里提出或者聯系我哦!
【轉載文章務必保留出處和署名,謝謝!】