您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > JAVA

支付宝app支付服务端的实现-Java版

时间:2020-11-16 10:42:47  来源:  作者:

前言

最近在工作中需要使用支付宝App支付,在初次使用过程中也不可避免的出现了一些问题,那么本次随笔主要是概述支付宝app支付服务端的整个实现过程以及就服务端出现的一些问题做一些总结。

1.准备工作

1.1 入驻蚂蚁金服开放平台

https://open.alipay.com/platform/home.htm

1.2 创建应用

首先需要创建一个应用

支付宝app支付服务端的实现-Java版
支付宝app支付服务端的实现-Java版
支付宝app支付服务端的实现-Java版

然后需要设置应用公钥。

支付宝app支付服务端的实现-Java版

下载支付宝密钥生成器。生成成功之后会有商户应用公钥和私钥,将公钥复制到这里, 私钥请妥善保存。下载地址:https://docs.open.alipay.com/291/106097/。保存设置之后会显示支付宝公钥,请妥善保存。

支付宝app支付服务端的实现-Java版

最后提交审核,等待。

注意:如果应用审核通过上线之后,支付宝公钥忘记后可通过进入应用详情页,按如下图所示查看支付宝公钥。

支付宝app支付服务端的实现-Java版

2.Maven依赖

首先需要下载SDK,https://docs.open.alipay.com/54/104509。

完成之后,需要切换命令行,进入SDK所在目录,执行如下命令。如果命令无法执行,请百度如何配置maven环境变量,配置好之后再执行。

 mvn install:install-file -DgroupId=com.alipay.sdk -DartifactId=alipay-sdk-JAVA -Dversion=3.1.0 -Dpackaging=jar -Dfile=SDK文件名.jar

groupId:可以自己定义,pom文件依赖依据与此

artifactId:可以自己定义,pom文件依赖依据与此

version:可以自己定义,pom文件依赖依据与此

packaging:打包方式(jar)

file:文件的路径的路径

在pom.xml中引入依赖,如下。

<!-- 支付宝支付相关start -->

<dependency>

<groupId>com.alipay.sdk</groupId>

<artifactId>alipay-sdk-java</artifactId>

<version>3.1.0</version>

</dependency>

<!-- 支付宝支付相关end -->

3.配置文件中配置支付宝相关参数

#支付宝支付相关配置

#支付宝分配给开发者的应用Id

aliPayAppId=XXX

#卖家支付宝用户号(对应异步通知返回参数seller_id)(可以不配置,只是异步通知时为了进一步校验而配置)

aliPaySellerId=XXX

#卖家支付宝账号(对应异步通知返回参数seller_email)(可以不配置,只是异步通知时为了进一步校验而配置)

alipayAccount=XXX

#商户应用公钥

rsaPublicKey=XXX

#商户应用私钥(注意,如果是Java语言,需要使用pkcs8格式的私钥,避免出现不可预知的错误)

rsaPrivatKey=XXX

#支付宝公钥

rsaAlipayPublicKey=XXX

#加密方式

signType=XXX

#仅支持JSON

alipayFormat=json

#请求使用的编码格式,如utf-8,gbk,gb2312等

alipayCharset=utf-8

4.生成Android/ target=_blank class=infotextkey>安卓端需要的orderString信息的接口方法

/**

*app支付

*

*@author lp

*@date 2019/1/4 16:32

*/

@ApiOperation("app支付")

@RequestMapping(value = "alipay", method = RequestMethod.POST)

public String alipay(@RequestBody CombinedPaymentDto dto, HttpServletResponse response, HttpServletRequest request) {

response.setHeader("Access-Control-Allow-Origin", "*");

// 获取项目中实际的订单的信息

// 此处是相关业务代码

// 获取配置文件中支付宝相关信息(可以使用自己的方式获取)

String aliPayGateway = PropertiesUtils.getInstace("config/webService.properties").getProperty("aliPayGateway");

String aliPayAppId = PropertiesUtils.getInstace("config/webService.properties").getProperty("aliPayAppId");

String rsaPublicKey = PropertiesUtils.getInstace("config/webService.properties").getProperty("rsaPublicKey");

String rsaPrivatKey = PropertiesUtils.getInstace("config/webService.properties").getProperty("rsaPrivatKey");

String rsaAlipayPublicKey = PropertiesUtils.getInstace("config/webService.properties").getProperty("rsaAlipayPublicKey");

String signType = PropertiesUtils.getInstace("config/webService.properties").getProperty("signType");

String alipayFormat = PropertiesUtils.getInstace("config/webService.properties").getProperty("alipayFormat");

String alipayCharset = PropertiesUtils.getInstace("config/webService.properties").getProperty("alipayCharset");

// 开始使用支付宝SDK中提供的API

AlipayClient alipayClient = new DefaultAlipayClient(aliPayGateway, aliPayAppId, rsaPrivatKey, alipayFormat, alipayCharset, rsaAlipayPublicKey, signType);

// 注意:不同接口这里的请求对象是不同的,这个可以查看蚂蚁金服开放平台的API文档查看

AlipayTradeAppPayRequest alipayRequest = new AlipayTradeAppPayRequest();

AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();

model.setBody("XXX");

model.setSubject("XXX");

// 唯一订单号 根据项目中实际需要获取相应的

model.setOutTradeNo("");

// 支付超时时间(根据项目需要填写)

model.setTimeoutExpress("30m");

// 支付金额(项目中实际订单的需要支付的金额,金额的获取与操作请放在服务端完成,相对安全)

model.setTotalAmount("");

model.setProductCode("QUICK_MSECURITY_PAY");

alipayRequest.setBizModel(model);

// 支付成功后支付宝异步通知的接收地址url

alipayRequest.setNotifyUrl("XXX/getAlipayNotifyInfo");

// 注意:每个请求的相应对象不同,与请求对象是对应。

AlipayTradeAppPayResponse alipayResponse = null;

try {

alipayResponse = alipayClient.sdkExecute(alipayRequest);

} catch (AlipayApiException e) {

e.printStackTrace();

}

// 返回支付相关信息(此处可以直接将getBody中的内容直接返回,无需再做一些其他操作)

return alipayResponse.getBody();

}

5.支付成功后服务端接收支付宝发来的异步通知的接口方法

/**

*接收支付宝异步通知消息

*

*@author lp

*@date 2019/1/4 17:19

*/

@ApiOperation("接收支付宝异步通知消息")

@RequestMapping(value = "getAlipayNotifyInfo", method = RequestMethod.POST)

public String getAlipayNotifyInfoOfCombinedPayment(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException {

response.setHeader("Access-Control-Allow-Origin", "*");

// 解决POST请求中文乱码问题(推荐使用此种方式解决中文乱码,因为是支付宝发送异步通知使用的是POST请求)

request.setCharacterEncoding("UTF-8");

//获取支付宝POST过来反馈信息

Map<String,String> params = new HashMap<>();

Map<String,String[]> requestParams = request.getParameterMap();

for (Iterator<String> 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] + ",";

}

 

// 官方demo中使用如下方式解决中文乱码,在此本人不推荐使用,可能会出现中文乱码解决无效的问题。

// valueStr = new String(valueStr.getBytes("ISO-8859-1"), "UTF-8");

 

params.put(name, valueStr);

}

// 支付宝公钥(请注意,不是商户公钥)

String rsaAlipayPublicKey = PropertiesUtils.getInstace("config/webService.properties").getProperty("rsaAlipayPublicKey");

String signType = PropertiesUtils.getInstace("config/webService.properties").getProperty("signType");

String alipayCharset = PropertiesUtils.getInstace("config/webService.properties").getProperty("alipayCharset");

boolean signVerified = false;

try {

//调用SDK验证签名

signVerified = AlipaySignature.rsaCheckV1(params, rsaAlipayPublicKey, alipayCharset, signType);

if(signVerified) {

// 验证通知后执行自己项目需要的业务操作

// 一般需要判断支付状态是否为TRADE_SUCCESS

// 更严谨一些还可以判断 1.appid 2.sellerId 3.out_trade_no 4.total_amount 等是否正确,正确之后再进行相关业务操作。

 

// 成功要返回success,不然支付宝会不断发送通知。

return "success";

}

// 验签失败 笔者在这里是输出log,可以根据需要做一些其他操作

 

// 失败要返回fail,不然支付宝会不断发送通知。

return "fail";

} catch (AlipayApiException e) {

e.printStackTrace();

// 验签异常 笔者在这里是输出log,可以根据需要做一些其他操作

return "fail";

}

}



Tags:支付宝   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
为切实推进智慧新民生建设,民航局公安局指导全国民航公安大数据战训中心研发了“民航临时乘机证明”支付宝小程序,现已正式上线运营。利用科技手段改进临时乘机证明办理程序,极...【详细内容】
2021-12-27  Tags: 支付宝  点击:(1)  评论:(0)  加入收藏
支付宝拥有一系列城市便民服务功能,可以帮助我们在线查看各种信息,结婚状态也可以查询了,那么具体怎么操作?今天小编就为大家带来这篇教程,还不会的同学快来学习一下吧!支付宝怎么...【详细内容】
2021-12-24  Tags: 支付宝  点击:(5)  评论:(0)  加入收藏
新京报快讯 据支付宝微信公众号消息,在开放共享和安全有序的原则下,支付宝与中国银联携手加速推进互联互通。最新的工作进展如下:支付宝与中国银联在2020年开始基于条码互联互...【详细内容】
2021-12-03  Tags: 支付宝  点击:(17)  评论:(0)  加入收藏
赚钱分为两种,分别是主动收入和被动收入,所谓主动收入也就是劳动所得,比如工薪报酬、经营所得等等,而被动收入则是不用付出劳动和汗水就能有的收入。 人们在通过劳动所得赚到钱...【详细内容】
2021-11-15  Tags: 支付宝  点击:(30)  评论:(0)  加入收藏
经常用支付宝的朋友,会发现支付宝首页的内容太多,花里胡哨的,有些内容,我们几乎用不到。这里,有简化首页界面的操作。第一步,打开支付宝&mdash;设置。 第二步,打开功能管理 第三步,...【详细内容】
2021-10-29  Tags: 支付宝  点击:(140)  评论:(0)  加入收藏
养老证明,在办理房租租赁及购买时,都需要我们提供。下面跟大家介绍一下如何在支付宝打印养老证明。第一步,打开支付宝app,没有的去应用商店直接搜索下载,可以点击搜索市民中心,添...【详细内容】
2021-10-17  Tags: 支付宝  点击:(41)  评论:(0)  加入收藏
支付宝是一款功能强大的金融软件,在支付宝里面我们可以通过它直接进行基金理财的操作,里面的各个基金可以供我们选择,在支付宝,购买基金绝对安全,因为支付宝只是一个寄售平台,基金...【详细内容】
2021-10-15  Tags: 支付宝  点击:(38)  评论:(0)  加入收藏
快快快!拿起手机在设置里面找到“记录APP活动”或“权限访问记录”功能,看看你被美团、淘宝、支付宝偷窥了多少次。APP疯狂定位、读取数据这事最先是被一位网友发现的,他在手机...【详细内容】
2021-10-15  Tags: 支付宝  点击:(31)  评论:(0)  加入收藏
每一位想换手机号的机主,都有自己的苦衷:或者因为套餐太贵,流量不够用,或者不堪电话、信息骚扰,又或者换了地方生活、工作等等需要更换新的手机号 想换个新手机号,又发愁支付宝、...【详细内容】
2021-09-16  Tags: 支付宝  点击:(77)  评论:(0)  加入收藏
如果换城市工作了,那么可以考虑转移社保到新城市。养老保险和公积金是分开转的。通常转社保指的是转移养老保险的资金和缴费年限记录。转移缴费年限记录是很重要的。因为社保...【详细内容】
2021-08-31  Tags: 支付宝  点击:(181)  评论:(0)  加入收藏
▌简易百科推荐
一、Redis使用过程中一些小的注意点1、不要把Redis当成数据库来使用二、Arrays.asList常见失误需求:把数组转成list集合去处理。方法:Arrays.asList 或者 Java8的stream流式处...【详细内容】
2021-12-27  CF07    Tags:Java   点击:(3)  评论:(0)  加入收藏
文章目录 如何理解面向对象编程? JDK 和 JRE 有什么区别? 如何理解Java中封装,继承、多态特性? 如何理解Java中的字节码对象? 你是如何理解Java中的泛型的? 说说泛型应用...【详细内容】
2021-12-24  Java架构师之路    Tags:JAVA   点击:(5)  评论:(0)  加入收藏
大家好!我是老码农,一个喜欢技术、爱分享的同学,从今天开始和大家持续分享JVM调优方面的经验。JVM调优是个大话题,涉及的知识点很庞大 Java内存模型 垃圾回收机制 各种工具使用 ...【详细内容】
2021-12-23  小码匠和老码农    Tags:JVM调优   点击:(11)  评论:(0)  加入收藏
前言JDBC访问Postgresql的jsonb类型字段当然可以使用Postgresql jdbc驱动中提供的PGobject,但是这样在需要兼容多种数据库的系统开发中显得不那么通用,需要特殊处理。本文介绍...【详细内容】
2021-12-23  dingle    Tags:JDBC   点击:(12)  评论:(0)  加入收藏
Java与Lua相互调用案例比较少,因此项目使用需要做详细的性能测试,本内容只做粗略测试。目前已完成初版Lua-Java调用框架开发,后期有时间准备把框架进行抽象,并开源出来,感兴趣的...【详细内容】
2021-12-23  JAVA小白    Tags:Java   点击:(10)  评论:(0)  加入收藏
Java从版本5开始,在 java.util.concurrent.locks包内给我们提供了除了synchronized关键字以外的几个新的锁功能的实现,ReentrantLock就是其中的一个。但是这并不意味着我们可...【详细内容】
2021-12-17  小西学JAVA    Tags:JAVA并发   点击:(10)  评论:(0)  加入收藏
一、概述final是Java关键字中最常见之一,表示“最终的,不可更改”之意,在Java中也正是这个意思。有final修饰的内容,就会变得与众不同,它们会变成终极存在,其内容成为固定的存在。...【详细内容】
2021-12-15  唯一浩哥    Tags:Java基础   点击:(14)  评论:(0)  加入收藏
1、问题描述关于java中的日志管理logback,去年写过关于logback介绍的文章,这次项目中又优化了下,记录下,希望能帮到需要的朋友。2、解决方案这次其实是碰到了一个问题,一般的情况...【详细内容】
2021-12-15  软件老王    Tags:logback   点击:(17)  评论:(0)  加入收藏
本篇文章我们以AtomicInteger为例子,主要讲解下CAS(Compare And Swap)功能是如何在AtomicInteger中使用的,以及提供CAS功能的Unsafe对象。我们先从一个例子开始吧。假设现在我们...【详细内容】
2021-12-14  小西学JAVA    Tags:JAVA   点击:(21)  评论:(0)  加入收藏
一、概述观察者模式,又可以称之为发布-订阅模式,观察者,顾名思义,就是一个监听者,类似监听器的存在,一旦被观察/监听的目标发生的情况,就会被监听者发现,这么想来目标发生情况到观察...【详细内容】
2021-12-13  唯一浩哥    Tags:Java   点击:(16)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条