支付寶--掃碼支付流程
1.首次知道,原來(支付寶支付介面)需要去螞蟻金服開發者幫助文件(尷尬)。
2.建立自己的應用,我選的是【自研接入】(這是一個坑,如果不是企業級應用,不能簽約,所有掃碼支付功能並不能使用),建立應用的時候選擇【支付接入】
3.有一個很坑爹的步驟:上傳圖示的時候,在螢幕的最右邊有一個編輯按鈕(我的天,我還以為我發現支付寶的一個BUG呢)
(注:上傳圖示要注意(不能為人物和動物頭像))
4.生成RSA 金鑰,下載支付提供的工具(windows 和 mac 倆個版本),生成以後,點選工具右下角有一個上傳公鑰,這裡我詳細的說一下,一共有三個(倆個是我們自己生成的,公鑰,私鑰,這倆個上傳之後會生成一個支付的公鑰)。
5.所有之前的都是準備工作,下面才是重頭戲,支付寶提供的是SDK,但是我們使用的是maven 搭建的spring-boot專案,所以我們先找一下有沒有支付寶maven 依賴。
<!--支付寶支付SDK--> <dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-sdk-java</artifactId> <version>3.4.27.ALL</version> </dependency>
6.在這裡我還要提一下,我自己要做的事情,是支付寶掃碼支付,所以我貼上一張支付流程圖
7.本地如果想呼叫第三方介面,需要有自己的域名,或者配置內網穿透(我下載的是花生殼,想必大家都聽說過哈 ,當然也不是免費的 6塊大洋)
8.我們要呼叫第三方的介面,需要組裝對應的AlipayTradePrecreateRequest請求
9.然後呼叫支付寶的響應請求AlipayTradePrecreateResponse ,下單(這個單官方已經給您解釋了,按照人家規定的組裝就可以了)
10.擷取一些比較重要的程式碼環節
常用引數配置類
public class AlipayConfig { //ServiceURL 設定閘道器 public static String ServiceUrl="https://openapi.alipay.com/gateway.do"; //APP支付寶支付業務:app_id public static String app_id = "你的專案APPID";//例:2016082600317257 // 商戶的私鑰,使用支付寶自帶的openssl工具生成。 public static String private_key = "你的私鑰"; // 應用的公鑰,無需修改該值 public static String ali_public_key = ""; // 支付寶的公鑰,去open.alipay.com對應應用下檢視。 public static String zfb_public_key=""; // 字元編碼格式 目前支援 gbk 或 utf-8 public static String input_charset = "UTF-8"; }
二維碼生成 Controller
@RequestMapping(value="/alipay")
@ApiOperation(value = "支付寶支付--下訂單--返回二維碼資料流")
public String ailipay(@RequestParam @ApiParam(required = true,name = "車牌號碼") String licensePlateNumber,HttpServletResponse servletResponse) throws AlipayApiException {
// 拼裝客戶端
AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.ServiceUrl,AlipayConfig.app_id,
AlipayConfig.private_key,"json",AlipayConfig.input_charset,AlipayConfig.zfb_public_key,"RSA2");
// 支付寶 request
AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
String subject = "華安停車支付寶支付測試";
String totalAmount = "0.01";
String storeId = "123";
AlipayTradePrecreateModel model = new AlipayTradePrecreateModel();
model.setSubject(subject);
model.setTotalAmount(totalAmount);
model.setStoreId(storeId);
model.setTimeoutExpress("5m");
//商品訂單號碼 out_trade_no 商戶訂單號,64個字元以內、只能包含字母、數字、下劃線;需保證在商戶端不重複
model.setOutTradeNo(UUID.randomUUID().toString());
request.setBizModel(model);
//request.set
// 支付寶 response 這裡已經對相應結果解析了。返回值
AlipayTradePrecreateResponse response = alipayClient.execute(request);
if(response.isSuccess()){
System.out.println("呼叫成功");
String code = response.getQrCode();
//二維碼資料流
System.out.println(code);
ZxingUtils.writeToServletFile(code,servletResponse);
} else {
System.out.println("呼叫失敗");
}
return "Success";
}
支付寶的二維碼需要自己生成的,官方下載的Demo中也有Zxing的工具類(我改良了一下,主要是用於web頁面顯示二維碼)
public static void writeToServletFile(String contents, HttpServletResponse resp){
try {
Map<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
hints.put(EncodeHintType.CHARACTER_SET, "UTF8");
BitMatrix bitMatrix = new MultiFormatWriter().encode(contents, BarcodeFormat.QR_CODE,
200, 200, hints);
MatrixToImageWriter.writeToStream(bitMatrix, "png", resp.getOutputStream());
} catch (Exception e) {
e.printStackTrace();
}
}
這是Zxing所需要的 maven 依賴
<!-- Zxing 二維碼生成器 -->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.3.3</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.2.0</version>
</dependency>
頁面可以用img標籤就可以接受我們轉換的流檔案(inputStream)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>測試二維碼生成</title>
</head>
<body>
<h1>
測試二維碼生成
</h1>
//這個地址是我通過花生殼轉換過的域名
<img src="http://2259b3c617.iok.la/pay/alipay?licensePlateNumber=12">
</body>
</html>
我們看一下頁面展示效果
最後我們需要寫一下支付成後以後的回撥用地址(這裡面有一個驗籤的過程提供很多種方法)
/**
* @Author : wangjian
* @Description 支付回掉URL
* @Date 2018/11/5 14:31
* @Param [licensePlateNumber]
* @Return java.lang.String
**/
@RequestMapping("/aliPayCallBack")
public String aliPayCallBack(HttpServletResponse response, HttpServletRequest request){
try {
Map<String,String> params = new HashMap<String,String>();
Map requestParams = request.getParameterMap();
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);
}
boolean flag = AlipaySignature.rsaCheckV1(params, AlipayConfig.zfb_public_key, AlipayConfig.input_charset,"RSA2");
String trade_status = request.getParameter("trade_status"); // 交易狀態
String order_no = request.getParameter("out_trade_no"); // 獲取訂單號
log.info("回撥過程獲取的訂單編號:{}" ,order_no);
// 獲取支付寶的通知返回引數,可參考技術文件中頁面跳轉同步通知引數列表(以上僅供參考)//
if (flag==true) {// 驗證成功
System.out.println("支付寶訂單支付成功!");
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("支付異常^-^");
}
return "";
}
最後還要稍微提一下,支付寶的沙箱測試(個人認為這也是比微信支付更牛逼的地方)
沙箱環境:在我理解看來就是一個模擬支付的流程(裡面可以模擬各種支付)
1.需要下載對應的支付寶APP(文件上有二維碼,當然目前只支援安卓手機下載)
2.下載好對應的APP以後,需要在支付寶開發裡再次上傳一下自己的公鑰,然後獲取支付寶對應的公鑰,重新分配一個APPID,
支付寶網關同時也需要改(後面加了一個dev ),看好喲。
3.改完之後就可以隨便測試了
好了,以上就是支付寶的掃碼支付的全部流程了,完成了簡單的支付流程,當然所有的程式碼都是擼在controller中,也沒有連線
資料庫,我是以一個小白的來自這件事情的,希望後續有人看了會對你有所幫助。