最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot整合支付寶APP支付

 更新時(shí)間:2019年08月23日 08:30:38   作者:Snow、楊  
這篇文章主要為大家詳細(xì)介紹了SpringBoot整合支付寶APP支付,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

前言

現(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, 北京聚智未來(lái)科技有限公司版權(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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 運(yùn)用springboot搭建并部署web項(xiàng)目的示例

    運(yùn)用springboot搭建并部署web項(xiàng)目的示例

    這篇文章主要介紹了運(yùn)用springboot搭建并部署web項(xiàng)目的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2018-06-06
  • 深入解析StringBuffer和StringBuilder的區(qū)別

    深入解析StringBuffer和StringBuilder的區(qū)別

    以下是對(duì)java中StringBuffer與StringBuilder的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以參考下
    2013-07-07
  • 解決idea2020.1 用gitee push推送被拒絕的原因(親測(cè)有效)

    解決idea2020.1 用gitee push推送被拒絕的原因(親測(cè)有效)

    這篇文章主要介紹了解決idea2020.1 用gitee push推送被拒絕的原因(親測(cè)有效),本文給大家分享解決方案,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 一篇文章讓你弄懂Java運(yùn)算符

    一篇文章讓你弄懂Java運(yùn)算符

    java中位運(yùn)算符主要有按位與&、按位或|、按位非~、按位異或^, 在使用時(shí)需要將運(yùn)算數(shù)都轉(zhuǎn)換為二進(jìn)制再進(jìn)行運(yùn)算,若為負(fù)數(shù)則使用補(bǔ)碼表示,這篇文章主要給大家介紹了關(guān)于Java運(yùn)算符的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • Java繼承子類的構(gòu)造函數(shù)方式

    Java繼承子類的構(gòu)造函數(shù)方式

    這篇文章主要介紹了Java繼承子類的構(gòu)造函數(shù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • String轉(zhuǎn)JSONObject的兩種方式

    String轉(zhuǎn)JSONObject的兩種方式

    這篇文章主要介紹了String轉(zhuǎn)JSONObject,本文通過實(shí)例代碼給大家介紹兩種方式轉(zhuǎn)換,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • svn 清理失敗 (cleanup 失敗) 的快速解決方法

    svn 清理失敗 (cleanup 失敗) 的快速解決方法

    下面小編就為大家?guī)?lái)一篇svn 清理失敗 (cleanup 失敗) 的快速解決方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2016-10-10
  • Mybatisplus更新某個(gè)字段為null問題

    Mybatisplus更新某個(gè)字段為null問題

    Mybatisplus更新某個(gè)字段為null時(shí),可以使用@TableField(updateStrategy=FieldStrategy.IGNORED)注解,該注解提供了字段映射、忽略非表字段、自動(dòng)填充策略、字段條件處理等功能
    2025-02-02
  • MybatisPlus的LambdaQueryWrapper用法詳解

    MybatisPlus的LambdaQueryWrapper用法詳解

    LambdaQueryWrapper<Tag>?是 MyBatis-Plus 框架中的一個(gè)功能強(qiáng)大的查詢構(gòu)造器,它用于構(gòu)建 SQL 查詢條件,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-10-10
  • SpringBoot選擇自有bean優(yōu)先加載實(shí)現(xiàn)方法

    SpringBoot選擇自有bean優(yōu)先加載實(shí)現(xiàn)方法

    在一些需求中,可能存在某些場(chǎng)景,比如先加載自己的bean,然后自己的bean做一些DB操作,初始化配置問題,然后后面的bean基于這個(gè)配置文件,繼續(xù)做其他的業(yè)務(wù)邏輯。因此有了本文的這個(gè)題目
    2023-03-03

最新評(píng)論

法库县| 礼泉县| 宜兰市| 锦屏县| 荥阳市| 基隆市| 富裕县| 洪湖市| 山阳县| 城步| 肃南| 渭南市| 京山县| 洪泽县| 巴马| 莲花县| 左权县| 班玛县| 临湘市| 灌阳县| 金寨县| 永善县| 福州市| 炎陵县| 葵青区| 历史| 平南县| 平安县| 张家港市| 丹凤县| 房山区| 渑池县| 横山县| 长春市| 闽清县| 芜湖市| 湖南省| 邳州市| 萝北县| 长兴县| 吉木萨尔县|