Springboot整合支付寶支付功能
1.需要的Maven依賴
// 支付寶 <dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-sdk-java</artifactId> <version>4.8.73.ALL</version> </dependency>
2.controller層
/**
* 統(tǒng)一下單接口
* @param orderNo 訂單號
* @param request
* @return
*/
@PostMapping("/unifiedOrder")
@CrossOrigin(origins = "*",maxAge = 3600)//跨域
public ResultMap unifiedOrder(@RequestParam("orderNo") String orderNo,@RequestParam("payType") Integer payType,
HttpServletRequest request){
try {
// 1、驗(yàn)證訂單是否存在
// 2、開始微信支付統(tǒng)一下單
Orders orders = ordersService.FindOrder(orderNo);
ResultMap resultMap =null;
if(orders!=null){
if(payType==1){
String spbill_create_ip = getIpAddr(request);
resultMap = wxPayService.unifiedOrder(orders.getOrderNo(),orders.getTotalPrice(),"云App",spbill_create_ip);
Hotel hotel= hotelMapper.selHotelById(orders.getHId());
Note note=new Note();
String s=note.Notefs(hotel.getPhone(),1);
ordersService.updataorderpaytype(orders.getOrderNo(),payType);
return resultMap;
}else if(payType==2){
// 2、創(chuàng)建支付寶訂單
String orderStr = alipayService.createOrder(orders.getOrderNo(), orders.getTotalPrice(),"App");
ordersService.updataorderpaytype(orders.getOrderNo(),payType);
return ResultMap.ok().put("data",orderStr);
}
}
return resultMap;//系統(tǒng)通用的返回結(jié)果集
} catch (Exception e) {
e.printStackTrace();
System.out.println(e.getMessage());
return ResultMap.error("服務(wù)器異常,付款失敗");
}
}
//這是支付寶異步回調(diào)函數(shù)
/**
* 支付異步通知
* 接收到異步通知并驗(yàn)簽通過后,一定要檢查通知內(nèi)容,
* 包括通知中的app_id、out_trade_no、total_amount是否與請求中的一致,并根據(jù)trade_status進(jìn)行后續(xù)業(yè)務(wù)處理。
* https://docs.open.alipay.com/194/103296
*/
@PostMapping("/notify")
@CrossOrigin(origins = "*",maxAge = 3600)//跨域
public String notify(HttpServletRequest request, HttpSession session) {
// 調(diào)用service層rsaCheckV1驗(yàn)證簽名
boolean flag = alipayService.rsaCheckV1(request);
if (flag) {
String tradeStatus = request.getParameter("trade_status"); // 交易狀態(tài)
String outTradeNo = request.getParameter("out_trade_no"); // 商戶訂單號
String tradeNo = request.getParameter("trade_no"); // 支付寶訂單號
/**
* 還可以從request中獲取更多有用的參數(shù),自己嘗試
*/
//調(diào)用service層notify函數(shù)
boolean notify = alipayService.notify(tradeStatus, outTradeNo, tradeNo);
if(notify){
return "success";
}
}
return "fail";
}3.service層
private String publicKey="公鑰";
@Override
public String createOrder(String orderNo, double amount, String body) throws AlipayApiException {
//SDK已經(jīng)封裝掉了公共參數(shù),這里只需要傳入業(yè)務(wù)參數(shù)。以下方法為sdk的model入?yún)⒎绞?model和biz_content同時(shí)存在的情況下取biz_content)。
//構(gòu)造client
//構(gòu)造client
CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
//設(shè)置網(wǎng)關(guān)地址https://openapi.alipay.com/gateway.do
certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do");
//設(shè)置應(yīng)用Id
certAlipayRequest.setAppId("appid");
//設(shè)置應(yīng)用私鑰
certAlipayRequest.setPrivateKey("應(yīng)用私鑰");
certAlipayRequest.setFormat("json");
//設(shè)置字符集
certAlipayRequest.setCharset("UTF-8");
//設(shè)置簽名類型
certAlipayRequest.setSignType("RSA2");
//設(shè)置應(yīng)用公鑰證書路徑
certAlipayRequest.setCertPath("證書驗(yàn)證的應(yīng)用公鑰證書路徑");
//設(shè)置支付寶公鑰證書路徑
certAlipayRequest.setAlipayPublicCertPath("證書驗(yàn)證的支付寶公鑰證書路徑");
//設(shè)置支付寶根證書路徑
certAlipayRequest.setRootCertPath("證書驗(yàn)證的支付寶根證書路徑");
//構(gòu)造client
AlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest);
//實(shí)例化具體API對應(yīng)的request類,類名稱和接口名稱對應(yīng),當(dāng)前調(diào)用接口名稱:alipay.trade.app.pay
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
//SDK已經(jīng)封裝掉了公共參數(shù),這里只需要傳入業(yè)務(wù)參數(shù)。以下方法為sdk的model入?yún)⒎绞?model和biz_content同時(shí)存在的情況下取biz_content)。
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
model.setSubject(body);
model.setOutTradeNo(orderNo);
model.setTotalAmount(String.valueOf(amount));
model.setTimeoutExpress("30m");
/*model.setTotalAmount("0.01");*/
model.setProductCode("QUICK_MSECURITY_PAY");
/* model.setPassbackParams("公用回傳參數(shù),如果請求時(shí)傳遞了該參數(shù),則返回給商戶時(shí)會(huì)回傳該參數(shù)");*/
//實(shí)例化具體API對應(yīng)的request類,類名稱和接口名稱對應(yīng),當(dāng)前調(diào)用接口名稱:alipay.trade.app.pay
AlipayTradeAppPayRequest ali_request = new AlipayTradeAppPayRequest();
ali_request.setBizModel(model);
ali_request.setNotifyUrl("回調(diào)地址");// 回調(diào)地址
AlipayTradeAppPayResponse ali_response = alipayClient.sdkExecute(ali_request);
//就是orderString 可以直接給客戶端請求,無需再做處理。
return ali_response.getBody();
}
//支付寶簽名驗(yàn)證
@Override
public boolean rsaCheckV1(HttpServletRequest request){
try {
//獲取支付寶POST過來反饋信息
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] + ",";
}
//亂碼解決,這段代碼在出現(xiàn)亂碼時(shí)使用。
//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
params.put(name, valueStr);
}
//切記alipaypublickey是支付寶的公鑰,請去open.alipay.com對應(yīng)應(yīng)用下查看。
//boolean AlipaySignature.rsaCertCheckV1(Map<String, String> params, String publicKeyCertPath, String charset,String signType)
boolean flag = AlipaySignature.rsaCertCheckV1(params, publicKey, alipayConfig.getCharset(),"RSA2");
/* 千萬不要調(diào)用錯(cuò)了?。?!上面的才是證書驗(yàn)證調(diào)用的函數(shù)這個(gè)是普通驗(yàn)證調(diào)用函數(shù) boolean verifyResult = AlipaySignature.rsaCheckV1(params, publicKey, alipayConfig.getCharset(), alipayConfig.getSignType());*/
System.out.println("flag-----------"+flag);
return flag;
}catch (AlipayApiException e) {
logger.debug("verify sigin error, exception is:{}",e);
return false;
}
}
//notify()支付成功或者失敗后一系列操作
@Override
public boolean notify(String tradeStatus, String orderNo, String tradeNo) {
if ("TRADE_FINISHED".equals(tradeStatus)
|| "TRADE_SUCCESS".equals(tradeStatus)) {
Orders orders =ordersMapper.FindOrder(orderNo);
// 支付成功,根據(jù)業(yè)務(wù)邏輯修改相應(yīng)數(shù)據(jù)的狀態(tài)
int state =ordersMapper.updateOrder(DateUtil.now(),orderNo);
Hotel hotel= hotelMapper.selHotelById(orders.getHId());
Note note=new Note();
String s=note.Notefs(hotel.getPhone(),1);
// boolean state = orderPaymentService.updatePaymentState(orderNo, tradeNo);
if (state!=0) {
return true;
}else {
UMember m= memberMapper.selMemByOrderNo(orderNo);
Boolean b= userMapper.updateVip(m.getOpenId(),2);
}
}
//支付失敗查詢訂單詳情得到用戶id
Orders orders=ordersMapper.FindOrder(orderNo);
//將扣除的積分返還
if(orderNo!=null){
//添加用戶積分
ordersMapper.RefundIntegral(orders.getOpenId(),orders.getIntegral());
/*//添加退回積分記錄
ordersMapper.insIntegralRecord(orders.getOpenId(),orders.getIntegral(),1,2);*/
}
return false;
}哈哈,以上僅為基礎(chǔ)版證書驗(yàn)證支付寶支付的源碼,有很大的優(yōu)化空間,需要小伙伴自己去優(yōu)化了!
到此這篇關(guān)于Springboot整合支付寶支付功能的文章就介紹到這了,更多相關(guān)Springboot支付寶支付內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- springboot對接支付寶支付接口(詳細(xì)開發(fā)步驟總結(jié))
- SpringBoot集成支付寶沙箱支付(支付、退款)
- springboot調(diào)用支付寶第三方接口(沙箱環(huán)境)
- SpringBoot整合支付寶APP支付
- springboot 集成支付寶支付的示例代碼
- SpringBoot集成支付寶沙箱支付的實(shí)現(xiàn)示例
- SpringBoot接入支付寶支付的方法步驟
- Vue+SpringBoot實(shí)現(xiàn)支付寶沙箱支付的示例代碼
- SpringBoot下如何實(shí)現(xiàn)支付寶接口的使用
- SpringBoot集成支付寶支付的實(shí)現(xiàn)示例
相關(guān)文章
Java項(xiàng)目導(dǎo)入IDEA的流程配置以及常見問題解決方法
通常一個(gè)團(tuán)隊(duì)中可能有人用eclipse,有人用intelliJ,那么經(jīng)常會(huì)出現(xiàn)需要導(dǎo)入別人用eclipse建好的web項(xiàng)目,下面這篇文章主要給大家介紹了關(guān)于Java項(xiàng)目導(dǎo)入IDEA的流程配置以及常見問題解決方法的相關(guān)資料,需要的朋友可以參考下2023-05-05
Java中BeanUtils.copyProperties()詳解及應(yīng)用場景
BeanUtils.copyProperties()是Apache?Commons?BeanUtils提供的方法,用于Java對象間屬性的復(fù)制,特別適用于DTO、VO和Entity之間的數(shù)據(jù)傳遞,這篇文章主要介紹了Java中BeanUtils.copyProperties()詳解及應(yīng)用場景的相關(guān)資料,需要的朋友可以參考下2024-09-09
SpringCloud Feign配置應(yīng)用詳細(xì)介紹
這篇文章主要介紹了SpringCloud Feign配置應(yīng)用,feign是netflix提供的服務(wù)間基于http的rpc調(diào)用框架,在spring cloud得到廣泛應(yīng)用2022-09-09
Springboot微服務(wù)項(xiàng)目整合Kafka實(shí)現(xiàn)文章上下架功能
這篇文章主要介紹了Springboot微服務(wù)項(xiàng)目整合Kafka實(shí)現(xiàn)文章上下架功能,包括Kafka消息發(fā)送快速入門及相關(guān)功能引入,本文通過示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07
使用JMeter進(jìn)行接口高并發(fā)測試的實(shí)現(xiàn)
本文主要介紹了使用JMeter進(jìn)行接口高并發(fā)測試的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
Spring Boot2解決idea console 控制臺(tái)輸出亂碼的問題
這篇文章主要介紹了Spring Boot2解決idea console 控制臺(tái)輸出亂碼的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
Kafka單機(jī)多broker實(shí)例集群搭建教程詳解
Apache?Kafka?是一個(gè)分布式流處理平臺(tái),廣泛應(yīng)用于日志收集、監(jiān)控?cái)?shù)據(jù)聚合等,本文將詳細(xì)介紹如何在一個(gè)單機(jī)上搭建多個(gè)Kafka?Broker實(shí)例的步驟,希望對大家有所幫助2025-03-03
SpringCloud2020整合Nacos-Bootstrap配置不生效的解決
這篇文章主要介紹了SpringCloud2020整合Nacos-Bootstrap配置不生效的解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
java巧用@Convert實(shí)現(xiàn)表字段自動(dòng)轉(zhuǎn)entity
本文主要介紹了java巧用@Convert實(shí)現(xiàn)表字段自動(dòng)轉(zhuǎn)entity,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07

