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

前言

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

1.准备工作

1.1 入驻蚂蚁金服开放平台

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

1.2 创建应用

首先需要创建一个应用。

86881bd6b5f569f5f46d8c86b0c930e2.png

1907f7269747a5269d749521b26f510b.png

90adeab128efbce1abea90dd425c0764.png

然后需要设置应用公钥。

a90e040cac03f500876c9614f93ae30a.png

下载支付宝密钥生成器。生成成功之后将公钥复制到这里。

b_0_201901210716398852.jpg

de300d8b598285325901d86f7f03f5d4.png

最后提交审核,等待。

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中引入依赖,如下。

com.alipay.sdk

alipay-sdk-java

3.1.0

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.生成安卓端需要的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");

alipayclient alipayclient = new defaultalipayclient(alipaygateway, alipayappid, rsaprivatkey, alipayformat, alipaycharset, rsaalipaypublickey, signtype);

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 params = new hashmap<>();

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] + ",";

}

// 官方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,可以根据需要做一些其他操作

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

return "fail";

} catch (alipayapiexception e) {

e.printstacktrace();

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

return "fail";

}

}

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值