SpringBoot整合支付寶APP支付
前言
現(xiàn)在是移動(dòng)端產(chǎn)品瘋狂的年代,隨之,移動(dòng)端支付也是熱門小技能,最近本公司在做一個(gè)移動(dòng)端,要接入微信支付和支付寶支付,老習(xí)慣,功能做完之后做個(gè)復(fù)盤記錄,這邊主要講解支付寶APP支付
所需條件
1、創(chuàng)建螞蟻金服開放平臺(tái)公司賬號(hào)
2、選擇開發(fā)中心---->移動(dòng)應(yīng)用
3、選擇支付接入
4、創(chuàng)建應(yīng)用
5、查看應(yīng)用appId
6、添加功能
兩個(gè)功能:支付寶授權(quán)功能和APP支付功能
7、功能簽約
開發(fā)流程
引入支付寶支付SDK
<!-- 支付寶支付 SDK --> <dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-sdk-java</artifactId> <version>3.7.4.ALL</version> </dependency>
1、支付寶參數(shù)配置類
/** * AlipayConfig.java * com.prereadweb.order.config * Copyright (c) 2019, 北京聚智未來科技有限公司版權(quán)所有. */ package com.prereadweb.order.config; /** * @Description: 支付寶支付配置文件 * @author: Administrator * @date: 2019/6/11 17:01 */ public class AlipayConfig { // APPID public static String app_id = "你應(yīng)用的APPID"; // 生成公鑰時(shí)對(duì)應(yīng)的私鑰(填自己的) public static String private_key = "你的秘鑰"; //異步回調(diào)接口:得放到服務(wù)器上,且使用域名解析 IP public static String notify_url = "回調(diào)函數(shù)接口"; //支付寶網(wǎng)關(guān)(注意沙箱alipaydev,正式則為 alipay)不需要修改 public static String url = "https://openapi.alipay.com/gateway.do"; //編碼類型 public static String charset = "UTF-8"; //數(shù)據(jù)類型 public static String format = "json"; // 公鑰 public static String public_key = "你的公鑰"; //簽名類型 public static String signtype = "RSA2"; }
2、下單接口
controller層
/** * @Function: 去支付 * @author: YangXueFeng * @Date: 2019/6/11 16:10 */ @RequestMapping("/gotopay") public Object goToPay(@Param("orderId") Long orderId){ return alipayViewService.setGotoPayInfos(orderId); }
service層
/** * @Function: 去支付 * @author: YangXueFeng * @Date: 2019/6/11 16:11 */ @Override public Map<String, Object> setGotoPayInfos(Long orderId) { Map<String, Object> map = new HashMap<>(); if(Util.isEmpty(orderId)){ map.put("code", UserStatusEnum.EMPTY.intKey()); map.put("msg", UserStatusEnum.EMPTY.value()); return map; } /* 查詢訂單信息 */ PayParameterForm payParameter = orderMapper.getPayParameter(orderId); AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.url, AlipayConfig.app_id, AlipayConfig.private_key, AlipayConfig.format, AlipayConfig.charset, AlipayConfig.public_key, AlipayConfig.signtype);//支付寶需要的參數(shù)serverUrl、appId、private_key、format、charset、public_key、signType AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest(); AlipayTradeAppPayModel model = new AlipayTradeAppPayModel(); model.setBody(payParameter.getTitle());//商品信息 model.setSubject(payParameter.getTitle());//商品名稱 model.setOutTradeNo(String.valueOf(payParameter.getOrderId()));//訂單號(hào) model.setTimeoutExpress("30m");//支付超時(shí)時(shí)間 /* model.setTotalAmount(String.valueOf(payParameter.getActualPrice()));// 支付金額 */ model.setTotalAmount(String.valueOf(0.01));// 支付金額 request.setBizModel(model); // 回調(diào)地址(充值訂單) request.setNotifyUrl(AlipayConfig.notify_url);// 回調(diào)地址 //這里和普通的接口調(diào)用不同,使用的是sdkExecute AlipayTradeAppPayResponse response = null; try { response = alipayClient.sdkExecute(request); map.put("code", UserStatusEnum.SUCCESS.intKey()); map.put("msg", UserStatusEnum.SUCCESS.value()); Map<String, Object> dataMap = new HashMap<>(); dataMap.put("payPath", response.getBody()); map.put("data", dataMap); return map; } catch (AlipayApiException e) { e.printStackTrace(); } map.put("code", UserStatusEnum.ERROR.intKey()); map.put("msg", UserStatusEnum.ERROR.value()); return map; }
3、回調(diào)接口
controller層
/** * @Function: 支付寶異步通知回調(diào) * @author: YangXueFeng * @Date: 2019/6/11 20:02 */ @ResponseBody @RequestMapping("/notify") public String notify(HttpServletRequest request, HttpServletResponse response) { return alipayViewService.notify(request, response); }
service層
/** * @Function: 支付寶異步回調(diào)接口 * @author: YangXueFeng * @Date: 2019/6/11 20:03 */ @Override public String notify(HttpServletRequest request, HttpServletResponse response) { Map<String, String> params = new HashMap<String, String>(); //從支付寶回調(diào)的request域中取值 Map<String, String[]> requestParams = request.getParameterMap(); for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) { String name = iter.next(); String[] values = 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í)使用。如果mysign和sign不相等也可以使用這段代碼轉(zhuǎn)化 // valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk"); params.put(name, valueStr); } //商品訂單號(hào) String out_trade_no = request.getParameter("out_trade_no"); // 商戶訂單號(hào) // 當(dāng)前交易狀態(tài) String tradeStatus = request.getParameter("trade_status"); //交易狀態(tài) // 支付金額 String totalAmount = request.getParameter("total_amount"); //交易狀態(tài) // 支付時(shí)間 String payDate = request.getParameter("gmt_payment"); //交易狀態(tài) //3.簽名驗(yàn)證(對(duì)支付寶返回的數(shù)據(jù)驗(yàn)證,確定是支付寶返回的) boolean signVerified = false; try { //3.1調(diào)用SDK驗(yàn)證簽名 signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.public_key, AlipayConfig.charset, AlipayConfig.signtype); } catch (AlipayApiException e) { e.printStackTrace(); } //返回狀態(tài)存入redis中 //對(duì)驗(yàn)簽進(jìn)行處理 if (signVerified) { //驗(yàn)簽通過 if(tradeStatus.equals("TRADE_SUCCESS")) { //支付成功后的業(yè)務(wù)處理 OrderEntity order = orderMapper.getOrderInfo(Long.valueOf(out_trade_no)); if(!Util.isEmpty(order)){ order.setStatus(CalculatStaticConstant.CHECK_ONE); order.setCompleteTime(DateUtil.currentDate()); orderMapper.updateOrder(order); } /* 添加支付信息 */ OrderPayEntity orderPay = new OrderPayEntity(); orderPay.setId(Long.valueOf(IdUtils.getPrimaryKey())); orderPay.setOrderId(order.getId()); orderPay.setUserId(order.getUserId()); orderPay.setPayPrice(Double.valueOf(totalAmount)); orderPay.setPayType(PayTypeEnum.ALI_PAY.intKey()); orderPay.setStatus(CalculatStaticConstant.CHECK_ONE); orderPay.setPayTime(payDate); orderMapper.saveOrderPay(orderPay); RedisUtil.set("ali"+out_trade_no, tradeStatus,300); return "success"; } } else { //驗(yàn)簽不通過 System.err.println("驗(yàn)簽失敗"); return "failure"; } return "failure"; }
此處回調(diào)函數(shù)接口要有返回值,成功后返回success(success是小寫,別大寫),此處如果沒有返回值的話,支付寶會(huì)一直進(jìn)行回調(diào)通知
至此,支付寶APP支付OK
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- springboot對(duì)接支付寶支付接口(詳細(xì)開發(fā)步驟總結(jié))
- SpringBoot集成支付寶沙箱支付(支付、退款)
- springboot調(diào)用支付寶第三方接口(沙箱環(huán)境)
- springboot 集成支付寶支付的示例代碼
- SpringBoot集成支付寶沙箱支付的實(shí)現(xiàn)示例
- SpringBoot接入支付寶支付的方法步驟
- Vue+SpringBoot實(shí)現(xiàn)支付寶沙箱支付的示例代碼
- SpringBoot下如何實(shí)現(xiàn)支付寶接口的使用
- Springboot整合支付寶支付功能
- SpringBoot集成支付寶支付的實(shí)現(xiàn)示例
相關(guān)文章
eclipse導(dǎo)入工程報(bào)錯(cuò)問題項(xiàng)目或者文件有紅叉的解決方案
這篇文章主要介紹了eclipse導(dǎo)入工程報(bào)錯(cuò)問題項(xiàng)目或者文件有紅叉的解決方案,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05java統(tǒng)計(jì)文件中每個(gè)字符出現(xiàn)的個(gè)數(shù)
這篇文章主要為大家詳細(xì)介紹了java統(tǒng)計(jì)文件中每個(gè)字符出現(xiàn)的個(gè)數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03深層剖析java應(yīng)用開發(fā)中MyBayis緩存
這篇文章主要為大家深層剖析java開發(fā)中MyBayis緩存,文中講解了Mybatis緩存的分類以及使用的方式,有需要的朋友可以借鑒參考下,希望可以有所幫助2021-09-09java處理數(shù)據(jù)庫不支持的emoji表情符問題解決
這篇文章主要介紹了java處理數(shù)據(jù)庫不支持的emoji表情符問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09spring mvc實(shí)現(xiàn)文件上傳與下載功能
這篇文章主要為大家詳細(xì)介紹了spring mvc實(shí)現(xiàn)文件上傳與下載功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12Springcloud整合stream,rabbitmq實(shí)現(xiàn)消息驅(qū)動(dòng)功能
官方定義SpringCloud?Stream?是一個(gè)構(gòu)建消息驅(qū)動(dòng)微服務(wù)的框架。我們只需要搞清楚如何與Spring?Cloud?Stream?交互就可以方便使用消息驅(qū)動(dòng)的方式。本文將通過Springcloud整合stream,rabbitmq實(shí)現(xiàn)消息驅(qū)動(dòng)功能,需要的可以參考一下2022-02-02