收起
支付宝APP支付JAVA后台流程demo举例及文档说明
一、文档地址:
1. 支付宝APP支付API文档: https://docs.open.alipay.com/204/105297/
2. 服务端SDK说明文档: https://docs.open.alipay.com/54/103419/
3. 如遇到问题或不明白建议在蚂蚁金服开发者社区进行咨询: https://openclub.alipay.com/
二、流程步骤:
1. 客户端(手机APP)在支付页面发起支付时,调起服务端接口,服务端调用支付宝创建订单接口并获取一个签名字符串返回给客户端即可。
2. 客户端拿到参数后,通过支付宝提供的SDK直接就可以调起支付宝支付界面完成支付,完成支付后:
2.1 支付宝同步回调客户App端(仅作为支付结束的通知及页面显示参考,实际支付是否成功,完全依赖服务端异步通知)
2.2 支付宝根据创建订单API中传入的异步通知地址notify_url,通过POST请求的形式将支付结果作为参数通知到商户系统,处理后,若成功则返回“success”这7个字符,如返回其他的字符,支付宝会在接下来的25小时以内完成8次通知(通知的间隔频率一般是:4m,10m,10m,1h,2h,6h,15h)
3. 内网穿透方法:使用过几个软件,花生壳是比较简单的,可自行百度
三、java操作支付宝APP支付demo:
-
接入支付宝:
App支付快速接入文档:https://docs.open.alipay.com/204/105297/
1.1 注册支付宝企业账号
https://memberprod.alipay.com/account/reg/enterpriseIndex.htm
1.2 签约APP支付功能,获取pid
https://b.alipay.com/signing/productScene.htm?sceneId=wysk&navKey=wysk
1.3 签约成功后配置应用网关、获取应用私钥(pkcs8)、支付宝公钥...
参考快速接入文档中《第二步》
1.4 完成以上操作后得到APPID,app_private_key(自己生成的应用私钥)、alipay_public_key(支付宝公钥:用自己生成的公钥换取到)
-
在pom文件中添加支付宝依赖
<dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-sdk-java</artifactId> <version>3.4.49.ALL</version> </dependency>
-
创建支付宝配置文件
alipay:
appId: 应用ID
pId: 签约后生成的PID
signType: 签名算法类型
version: 调用的接口版本 1.0
charset: 编码格式 utf-8
format: 返回格式 json
notifyUrl: 回调地址
aliUrl: 支付宝网关地址
privateKey: 应用私钥文件地址,由于私钥比较长所以单独存入一个文件中
alipayPublicKey: 支付宝公钥
timeoutExpress: 超时时间
config配置类举例:
@Component
public class AlipayConfig {
public static String APP_PRIVATE_KEY;
public static String APP_ID;
.....省略定义
@Value("${alipay.privateKey}")
public void setAppPrivateKey(String appPrivateKey) {
String key = "";
try {
if(!StringUtils.isNullOrEmpty(appPrivateKey)){
//根据应用私钥文件地址,获取文件内容
ClassPathResource classPathResource = new ClassPathResource(appPrivateKey);
InputStream inputStream = classPathResource.getInputStream();
key = new BufferedReader(new InputStreamReader(inputStream))
.lines().collect(Collectors.joining(System.lineSeparator()));
inputStream.close();
}
}catch (Exception e){
e.printStackTrace();
}
APP_PRIVATE_KEY = key;
}
@Value("${alipay.appId}")
public void setAppId(String appId) {
APP_ID = appId;
}
...... 省略注入
-
创建支付宝APP支付订单
4.1 实例化支付宝客户端clientAlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.支付宝网关地址, AlipayConfig.APP_ID, AlipayConfig.应用私钥, AlipayConfig.返回格式, AlipayConfig.编码格式, AlipayConfig.支付宝公钥, AlipayConfig.签名算法类型);
4.2 实例化具体API对应的request类,类名和接口类型对应,APP支付为:alipay.trade.app.pay
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
4.3 实例化具体业务对应的model 并set入业务参数值
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel(); model.setSubject(商品的标题/交易标题/订单标题/订单关键字等都可以); model.setOutTradeNo(商户订单号); model.setTimeoutExpress(AlipayConfig.交易超时时间); //,输入正确密码后才创建订单开始计时;还有一个time_expre是绝对超时时间,但是官方说明在APP支付里time_expre已经不做使用了 model.setTotalAmount(支付金额); model.setProductCode("QUICK_MSECURITY_PAY"); //销售产品码,固定为QUICK_MSECURITY_PAY ExtendParams extendParams = new ExtendParams(); //业务扩展参数,可选 extendParams.setSysServiceProviderId(AlipayConfig.签约协议的PID); model.setExtendParams(extendParams);
4.4 将model类set入request并设置回调地址
request.setBizModel(model); request.setNotifyUrl(AlipayConfig.回调地址);
4.5 使用client.sdkExecute调用支付宝客户端创建订单,使用具体API对应的response类进行接收,获取response.body 即前面提到的签名字符串,返回前台即可
AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request); orderStr = response.getBody();
-
异步回调
5.1 获取支付宝POST过来的反馈信息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] + ","; } // 乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化 //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8"); params.put(name, valueStr); }
5.2 调用SDK验证签名
boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.应用私钥, AlipayConfig.编码格式, AlipayConfig.签名算法类型);
5.3 验证反馈信息中的out_trade_no是否为系统中创建的订单号,otal_amount是否确实为订单的实际金额,验证app_id是否为商户本身(由于我的APP中只有一个操作方,所以本文中没有seller_id的说明,如遇到可以在开发者社区进行百度)
String out_trade_no = request.getParameter("out_trade_no"); //商户订单号 String tradeStatus = request.getParameter("trade_status"); //交易状态 String tradeNo = request.getParameter("trade_no"); //支付宝交易凭证 ... 省略校验通知数据正确性的逻辑
5.4 交易状态为TRADE_SUCCESS则交易成功
if ("TRADE_SUCCESS".equals(tradeStatus)) { ...省略处理系统自己逻辑(更新订单状态等等) }
5.5 成功则返回"success" 失败返回"failure"
return "success"; //如果以上有验签或验证数据正确性失败则return fail 或return failure;
四、结尾
1. 以上仅是APP支付的demo,关于支付宝的退款、查询、转账等接口均可以举一反三的写出。
2. 开发过程中如有问题可以先在开发社区进行查询,如果仔细自查后还找不到问题,那么最快的办法就是联系技术客服!~
3. 关于开发过程的小贴士:
3.1 我是直接用正式环境进行验证的,很方便。
3.2 不要随意添加参数,开发时在支付宝配置的时候看到一个<接口内容加密方式: AES密钥> 作死加入了代码中,调了一上午最后咨询了技术客服,去掉这个后就成功了,所以还是按照支付宝sdk的demo来吧。
3.3 仔细一点的话接入还是很快的,坑很少 ,接入审核也很迅速,后续有机会再写关于接入微信支付的内容!~
ending : 以上就是所有内容啦,第一次接入支付也是第一次写博客,能力水平有限,有错误及不当之处还请指出,必定改正,~如若转载,请注明出处!!!
原文出处:https://blog.csdn.net/qq_31807451/article/details/85131820