前言
在這個網際網路創業的時代,支付功能已經成為一項必不可少的模組,隨著支付寶小程式的趨勢越來越火,繼上篇的授權登入之後,本章將帶入大家一起實現支付寶支付的業務流程。廢話不多說,直接上流程!
前置條件
-
簽約【小程式支付】功能:小程式詳情 > 開發管理 > 功能列表,在 小程式支付 的操作列裡進行 簽約 流程操作,如下圖所示
接著按照提示完成簽約操作即可。簽約還沒通過前,大家可以使用沙箱環境來進行測試。
伺服器端
- IndexController.java程式碼
/**
* @Description 統一收單交易建立介面
* @Author LW-mochengdong
* @Date 2019/1/2 11:12
* @Param []
* @Return com.example.demo.VO.AlipayTradeResultVo
*/
@PostMapping("/pay")
public AlipayTradeResultVo pay() {
return indexService.pay();
}
/**
* @Description 支付完成後的回撥介面
* @Author LW-mochengdong
* @Date 2019/1/2 11:13
* @Param [request]
* @Return java.lang.String
*/
@PostMapping("/notifyUrl")
public String notifyUrl(HttpServletRequest request) {
return indexService.notifyUrl(request);
}
複製程式碼
- IndexService.java程式碼
統一下單介面的buyer_id是支付寶小程式授權登入成功後獲取到的user_id;非同步通知介面只有trade_status的值為TRADE_SUCCESS或TRADE_FINISHED時才算才成功!
/**
* @Description 統一下單介面
* @Author LW-mochengdong
* @Date 2019/1/2 17:59
* @Param [] 實際應用請自行傳遞引數
* @Return com.example.demo.VO.AlipayTradeResultVo
*/
public AlipayTradeResultVo pay() {
AlipayClient alipayClient = new DefaultAlipayClient(
aliXcxProperty.getPayServerUrl(),
aliXcxProperty.getPayAppId(),
aliXcxProperty.getPayPrivateKey(),
"JSON", "utf-8",
aliXcxProperty.getPayPublicKey(), "RSA2");
AlipayTradeCreateRequest request = new AlipayTradeCreateRequest();
String outTradeNo = UUID.randomUUID().toString().replace("-", "");
String buyer_id = "2088912995819430";//注意!注意!注意!這是支付寶小程式授權登入後獲取到的user_id
request.setNotifyUrl(aliXcxProperty.getPayNotifyUrl());
request.setBizContent("{" +
"\"out_trade_no\":\"" + outTradeNo + "\"," +
"\"total_amount\":0.01," +
"\"subject\":\"Iphone616G\"," +
"\"buyer_id\":\"" + buyer_id + "\"" +
"}");
try {
//使用的是execute
AlipayTradeCreateResponse response = alipayClient.execute(request);
return new AlipayTradeResultVO(response.getTradeNo());//獲取返回的tradeNO。
} catch (AlipayApiException e) {
e.printStackTrace();
}
return null;
}
/**
* @Description 非同步通知介面
* @Author LW-mochengdong
* @Date 2019/1/2 18:00
* @Param [request]
* @Return java.lang.String
*/
public String notifyUrl(HttpServletRequest request) {
//獲取支付寶POST過來反饋資訊
Map<String, String> params = new HashMap<>();
Map requestParams = request.getParameterMap();
for (Object o : requestParams.keySet()) {
String name = (String) o;
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] + ",";
}
params.put(name, valueStr);
}
log.info("notifyType is [{}]", params.get("notify_type"));
try {
boolean flag = AlipaySignature.rsaCheckV1(params, aliXcxProperty.getPayPublicKey(), "utf-8", "RSA2");
log.info("flag====[{}]", flag);
if (flag && (params.get("trade_status").equals("TRADE_SUCCESS")
|| params.get("trade_status").equals("TRADE_FINISHED"))) {
//todo 處理支付成功後的邏輯
return "success";
} else {
return "fail";
}
} catch (AlipayApiException e) {
e.printStackTrace();
}
return "fail";
}
複製程式碼
- AlipayTradeResultVO.java檔案
@Data
@AllArgsConstructor
public class AlipayTradeResultVo {
private String result;
}
複製程式碼
- AliXcxProperty.java配置檔案
@Data
@Component
@ConfigurationProperties(prefix = "luwei.ali.xcx")
public class AliXcxProperty {
private String payServerUrl;
private String payAppId;
private String payPrivateKey;
private String payPublicKey;
private String payNotifyUrl;
}
複製程式碼
- application.yaml配置檔案
其中 payServerUrl: 阿里的請求地址 payAppId: 應用的APPID payPrivateKey: 支付密碼 payPublicKey: 支付公鑰 payNotifyUrl: 非同步通知介面地址
客戶端
- index.axml檔案
<view>
{{index}}
<button onTap="index"> 首頁 </button>
<button onTap="getAuthCode"> 授權 </button>
<button onTap="pay"> 發起支付 </button>
</view>
複製程式碼
- index.js檔案
//發起支付
pay(){
my.httpRequest({
url: 'https://app2120230256test.mapp-test.xyz/pay',//須加httpRequest域白名單
method: 'POST',
data: {//data裡的key、value是開發者自定義的
from: '支付寶',
order: 'XXXXX',//訂單資訊
},
dataType: 'json',
success: function(res) {
my.tradePay({//調起支付頁面
tradeNO: res.data.result,
success: function(res) {
my.alert(res.resultCode);
},
fail: function(res) {
my.alert(res.resultCode);
},
});
},
fail: function(res) {
my.alert({content: 'fail'});
},
complete: function(res) {
my.hideLoading();
}
});
}
複製程式碼
測試
-
用真機開啟支付寶,掃除錯出的二維碼,然後點選發起支付,既彈出如下頁面
-
輸入密碼,後臺列印出的回撥資訊如下圖所示
- 前端成功頁面
至此,支付寶小程式的支付流程已完成,感謝各位大神的觀看、評價、校正。PS:下一篇將實現刷臉認證功能!
成東
廣州蘆葦科技Java開發團隊
蘆葦科技-廣州專業網際網路軟體服務公司
抓住每一處細節 ,創造每一個美好
關注我們的公眾號,瞭解更多
想和我們一起奮鬥嗎?lagou搜尋“ 蘆葦科技 ”或者投放簡歷到 server@talkmoney.cn 加入我們吧
關注我們,你的評論和點贊對我們最大的支援