1、首先申請企業認證的支付帳戶(如不是作公司項目,能夠用我的的)算法
2、去支付寶開放平臺申請網頁移動端應用express
點擊開發者中心,選擇網頁移動應用json
而後選擇支付接入api
填寫對應的信息,PC掃碼支付針對的是電腦端,因此我在此選擇網頁應用。注意網址的URL填寫的是項目在線上運行的網址。 服務器
而後確認建立,選擇添加功能,因爲該網站還作了H5網頁,因此我選擇了快捷手機支付,還有選擇電腦支付app
而後勾選已經贊成,再去配置應用網關、受權回調地址、設置應用公鑰(應用網關、受權回調地址是能夠不配置的)post
如下是應用網關設置的截圖網站
上傳的公用字符就是該應用的應用公鑰。在生成密鑰時,也會生成應用私鑰。咱們能夠將私鑰保存起來。後面支付接口會用到。編碼
而後就能夠提交去審覈。審覈以及簽約經過,上線後就能夠進行開發啦。url
3、開發環境配置
能夠去支付寶開放平臺進行下載 https://docs.open.alipay.com/194/106078
1AlipayClient alipayClient = new DefaultAlipayClient(URL, APP_ID, APP_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE);
關鍵參數說明:
配置參數 |
示例值解釋 |
獲取方式/示例值 |
URL |
支付寶網關(固定) |
https://openapi.alipay.com/gateway.do |
APP_ID |
APPID 即建立應用後生成 |
|
APP_PRIVATE_KEY |
開發者應用私鑰,由開發者本身生成 |
詳見配置密鑰 |
FORMAT |
參數返回格式,只支持 json 格式 |
json(固定) |
CHARSET |
請求和簽名使用的字符編碼格式,支持 GBK和 UTF-8 |
開發者根據實際工程編碼配置 |
ALIPAY_PUBLIC_KEY |
支付寶公鑰,由支付寶生成 |
詳見配置密鑰 |
SIGN_TYPE |
商戶生成簽名字符串所使用的簽名算法類型,目前支持 RSA2 和 RSA,推薦商家使用 RSA2。 |
RSA2 |
環境 | HTTPS請求地址 |
---|---|
正式環境 | https://openapi.alipay.com/gateway.do |
參數 | 類型 | 是否必填 | 最大長度 | 描述 | 示例值 |
---|---|---|---|---|---|
app_id | String | 是 | 32 | 支付寶分配給開發者的應用ID | 2014072300007148 |
method | String | 是 | 128 | 接口名稱 | alipay.trade.pay |
format | String | 否 | 40 | 僅支持JSON | JSON |
charset | String | 是 | 10 | 請求使用的編碼格式,如utf-8,gbk,gb2312等 | utf-8 |
sign_type | String | 是 | 10 | 商戶生成簽名字符串所使用的簽名算法類型,目前支持RSA2和RSA,推薦使用RSA2 | RSA2 |
sign | String | 是 | 344 | 商戶請求參數的簽名串,詳見簽名 | 詳見示例 |
timestamp | String | 是 | 19 | 發送請求的時間,格式"yyyy-MM-dd HH:mm:ss" | 2014-07-24 03:07:50 |
version | String | 是 | 3 | 調用的接口版本,固定爲:1.0 | 1.0 |
notify_url | String | 否 | 256 | 支付寶服務器主動通知商戶服務器裏指定的頁面http/https路徑。 | http://api.test.alipay.net/atinterface/receive_notify.htm |
app_auth_token | String | 否 | 40 | 詳見應用受權概述 | |
biz_content | String | 是 | 請求參數的集合,最大長度不限,除公共參數外全部請求參數都必須放在這個參數中傳遞,具體參照各產品快速接入文檔 |
具體參數去看支付寶官方文檔 https://docs.open.alipay.com/api_1/alipay.trade.pay
接下來,開發者就能夠用 alipayClient 來調用具體的 API 了。alipayClient 只須要初始化一次,後續調用不一樣的 API 均可以使用同一個 alipayClient 對象。
在application.yml封裝屬性
@Value("${app.ali-pay-appId}") private String APP_ID; /** * 應用私鑰 */ @Value("${app.ali-pay-merchantPrivateSign}") private String APP_PRIVATE_KEY; /** * 支付寶公鑰 */ @Value("${app.ali-pay-aliPublicSign}") private String ALIPAY_PUBLIC_KEY; /** * 回調地址 */ @Value("${app.ali-pay-notifyUrl}") private String notify_url; /** * 簽名類型 */ @Value("${app.ali-pay-signType}") private String SIGN_TYPE; /** * 編碼集 */ @Value("${app.ali-pay-charset}") private String CHARSET; /** * 支付寶網關 */ @Value("${app.ali-pay-payGateWay}") private String URL; @Value("${app.order-pay-switch}") private String flag;
統一下單接口
//實例化阿里支付 AlipayClient alipayClient = new DefaultAlipayClient(URL, APP_ID, APP_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE); //建立api對應的request AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest(); alipayRequest.setNotifyUrl(notify_url); //先生成一個隨機數當訂單號,後續修改正式使用的 String outTradeNo = "" + System.currentTimeMillis(); Map<String,Object> maps = new HashMap<>(); maps.put("out_trade_no",outTradeNo); maps.put("total_amount","0.01"); maps.put("product_code","FAST_INSTANT_TRADE_PAY"); //產品名後續修改 maps.put("subject", "Iphone6 16G"); maps.put("timeout_express","3m"); String postData = JSONObject.toJSONString(maps); alipayRequest.setBizContent(postData); logger.info("requestId:{},function:{},request:{}",requestId,"支付寶支付請求參數",postData); //AlipayTradePagePayResponse response = alipayClient.execute(alipayRequest); String form = alipayClient.pageExecute(alipayRequest).getBody(); logger.info("requestId:{},function:{},response:{}" , requestId , "aliPay" , form); logger.info("requestId:{},userId:{},function:{}",requestId,userIds,"發起支付寶支付請求");
//支付寶回調 @PostMapping(value = "/ali") @SkipUserAuth public String notify(HttpServletRequest request){ Map requestParams = request.getParameterMap(); String q = ""; for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) { String name = (String) iter.next(); String[] values = (String[]) requestParams.get(name); for (int i = 0; i < values.length; i++) { q+=name+"="+values[i]+"&"; } } System.out.println("支付寶支付結果通知"+requestParams.toString()); logger.info("requestId:{},function:{},response:{}",requestId,"支付寶支付結果通知",q); //獲取支付寶POST過來反饋信息 Map<String,String> params = new HashMap<String,String>(); for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) { String name = (String) iter.next(); String[] values = (String[]) requestParams.get(name); String valueStr = ""; for (int i = 0; i < values.length; i++) { valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ","; } //亂碼解決,這段代碼在出現亂碼時使用。 //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8"); params.put(name, valueStr); } logger.info("requestId:{},function:{},response:{}", requestId , "支付寶回調" , params.toString()); //boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type) try { //驗證簽名 boolean flag = AlipaySignature.rsaCheckV1(params, ALIPAY_PUBLIC_KEY, CHARSET,SIGN_TYPE); logger.info("requestId:{},function:{},response:{}", requestId, "支付寶回調驗證簽名", flag); if(flag){ if("TRADE_SUCCESS".equals(params.get("trade_status"))){ //商戶訂單號 String out_trade_no = params.get("out_trade_no"); logger.info("打印支付寶回調數據" + out_trade_no); //下面省略修改訂單邏輯 } } } catch (AlipayApiException e) { e.printStackTrace(); logger.info("requestId:{} err",request ,e); logger.error("requestId:{} err",request ,e); } return "success"; }
以上就是統一下單接口的方法和驗證簽名的方法