Java +支付宝 +接入
说下业务场景, 公司之前的支付宝业务是PHP对接的现在改成 Java ,在接入出现不同的问题。之前PHP用的是老的移动支付, 现在Java的新接口 , 需要签约。 跟运维沟通好几次, 说签约不了, 只能用老的移动支付方式;
1.1 移动支付文档
https://doc.open.alipay.com/doc2/detail?treeId=59&articleId=103563&docType=1
1.2 基本配置
按照支付宝的流程 。 生成 用户的私钥和公钥对 。 把 开发者的公约上传 到支付宝, 支付宝会生成一对, 支付宝私钥公钥对。 意思就是 两套私钥公钥 ; 怎么使用呢?
用户加签 的时候是用用户的私钥, 解密的时候是用 支付宝的 公钥 。
支付宝解密的时候用 用户的 公约, 加密的时候用支付宝 的私钥, 双向的; 这个逻辑必须要明白。
说下我这里的难题:因为以前的开发者公钥和私钥都是 PHP的, Java接入需要 使用 pks 8格式, 这里怎么解决了? 只用一步 , 把 PHP开发者的私钥 ---》转换成 Java的 的pks 8 私钥、 其他都不用管了。(因为涉及到了两种 语言的兼顾)。
1.3 Java 服务端需要考虑哪写?
第一个: 预购单签名 。 用户下单的时候 , 对 参数校验, 用开发者私钥, 生成签名字符串 给 APP。 APP 去完成支付、
第二个: 支付回调、 支付完成了, 支付宝会异步通知商户系统,我们要定义一个接口去处理参数。
第三个:可能加个查询接口 ,查询订单等。
第四个:支付宝退款。
第五个:支付宝退款回调。
=============================================
1.4 例子:
1. 下预购单:
public String getPayInfo(PayRequest request) {
// 签约合作者身份ID
String orderInfo = "partner=" + "\"" + AliPayConstants.PARTER_ID + "\"";
// 签约卖家支付宝账号
orderInfo += "&seller_id=" + "\"" + AliPayConstants.APP_ACCOUNT + "\"";
// 商户网站唯一订单号
orderInfo += "&out_trade_no=" + "\"" + request.getOutTradeNo() + "\"";
// 商品名称
orderInfo += "&subject=" + "\"" + request.getSubject() + "\"";
// 商品详情
orderInfo += "&body=" + "\"" + request.getBody() + "\"";
// 商品金额
orderInfo += "&total_fee=" + "\""
+ new BigDecimal(request.getTotalFee()).divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP) + "\"";
// 服务器异步通知页面路径
orderInfo += "¬ify_url=" + "\"" + "" + "\"";
// 服务接口名称, 固定值
orderInfo += "&service=\"mobile.securitypay.pay\"";
// 支付类型, 固定值
orderInfo += "&payment_type=\"1\"";
// 参数编码, 固定值
orderInfo += "&_input_charset=\"utf-8\"";
// 设置未付款交易的超时时间
// 默认30分钟,一旦超时,该笔交易就会自动被关闭。
// 取值范围:1m~15d。
// m-分钟,h-小时,d-天,1c-当天(无论交易何时创建,都在0点关闭)。
// 该参数数值不接受小数点,如1.5h,可转换为90m。
orderInfo += "&it_b_pay=\"30m\"";
// extern_token为经过快登授权获取到的alipay_open_id,带上此参数用户将使用授权的账户进行支付
// orderInfo += "&extern_token=" + "\"" + extern_token + "\"";
// 支付宝处理完请求后,当前页面跳转到商户指定页面的路径,可空
orderInfo += "&return_url=\"m.alipay.com\"";
// 调用银行卡支付,需配置此参数,参与签名, 固定值 (需要签约《无线银行卡快捷支付》才能使用)
// orderInfo += "&paymethod=\"expressGateway\"";
/**
* 特别注意,这里的签名逻辑需要放在服务端,切勿将私钥泄露在代码中!
*/
// sign = AlipaySignature.rsaSign(result,
// Constants.Ali_QM.ALI_APP_PRIVATE_KEY, Constants.Ali_QM.ALI_UNICODE);
String sign = SignUtils.sign(orderInfo, AliPayConstants.PRIVATE_KEY);
try {
sign = URLEncoder.encode(sign, "UTF-8");
} catch (UnsupportedEncodingException e) {
LOGGER.error(e.getMessage());
}
final String payInfo = orderInfo + "&sign=\"" + sign + "\"&" + "sign_type=\"RSA\"";
LOGGER.info("返回信息:" + payInfo);
return payInfo;
}
2. 支付宝支付完成回调: 传过来一个 request, 获取里面的参数, 如果校验正确, 返回 个给 支付宝 一个字符串 success。 告诉 支付宝 我们已经成功接收到回调了
public String aliCallback(HttpServletRequest request) {
LOGGER.info("正在回调");
PaymentDetail detail = new PaymentDetail();
detail.setorderOutId(request.getParameter("out_trade_no"));
detail.setTradeNo(request.getParameter("trade_no"));
detail.setUserId(request.getParameter("buyer_logon_id"));
// 设置为已回调
detail.setCallbackStatus(CallbackType.callable.getStatusValue());
boolean isPaySuccess = false;
if ("TRADE_SUCCESS".equals(request.getParameter("trade_status"))) {
Enumeration<?> pNames = request.getParameterNames();
Map<String, String> param = new HashMap<String, String>();
try {
while (pNames.hasMoreElements()) {
String pName = (String) pNames.nextElement();
param.put(pName, request.getParameter(pName));
}
boolean signVerified = AlipaySignature.rsaCheckV1(param, AliPayConstants.PUBLIC_KEY,
AliPayConstants.CHARSET); // 校验签名是否正确
if (signVerified) {
// 按照支付结果异步通知中的描述,对支付结果中的业务内容进行1\2\3\4二次校验,校验成功后在response中返回success,校验失败返回failure
LOGGER.info("订单支付成功:" + JSON.toJSONString(param));
// 设置订单状态为支付成功
detail.setStatus(PayStatus.paySuccess.getStatusValue());
isPaySuccess = true;
}
} catch (Exception e) {
LOGGER.error("回调异常");
throw new TradeException(MessageCode.PayBackError);
}
}
Integer callBackStatus = isPaySuccess ? PaymentConstant.PayCallBackStatus.SUCCESS
: PaymentConstant.PayCallBackStatus.FAILURE;
tradeService.dealWithPayCallBack(request.getParameter("out_trade_no"), request.getParameter("trade_no"),
callBackStatus, PaymentConstant.TradeAction.ALI_ACCOUNT);
paymentDetailsMapper.updatePayment(detail);
return "success";
Java +支付宝 +接入的更多相关文章
- Java +支付宝 +接入+最全+最佳-实战-demo
一.支付宝配置: 1.需要在支付宝商户平台购买支付的产品并开通支付. 2.购买支付产品登录支付宝:https://auth.alipay.com/login/index.htm 3.登录之后首页点击查 ...
- java支付宝开发-02-手机网站支付
源码已上传github,欢迎专注:https://github.com/shirayner/alipay-wap 一.基础部分 1.手机网站支付产品介绍 1.1 阅读官方介绍: 手机网站支付产品介绍 ...
- Java 支付宝支付,退款,单笔转账到支付宝账户(支付宝支付)
最近一直在接触第三方,刚接入完支付宝的API做一下总结,个人能力薄弱有不对的地方望指教. 做的是一个小型电商项目,所以会接入第三方的支付和登入功能, 第一次接入第三方撸了很多官方文档. 进入主题, ...
- Android 支付宝接入时常见的问题
1.概述 首先说明下,Android支付宝接入用的是快捷支付,下载地址是https://b.alipay.com/order/techService.htm 支付宝移动接入地址https://b ...
- Java项目接入sso单点登录
最近在落地cat(java开发的一款开源监控系统)接入公司的内部项目,其中有项需求是接入公司的sso单点登录系统.研究了公司之前java项目接入sso系统,大部分是采用spring框架,然后依赖spr ...
- java支付宝开发-01-沙箱环境接入
一.沙箱环境说明 (1)蚂蚁沙箱环境(Beta)是协助开发者进行接口功能开发及主要功能联调的辅助环境.沙箱环境模拟了开放平台部分产品的主要功能和主要逻辑(当前沙箱支持产品请参考“沙箱支持产品列表”). ...
- 关于Java调用接入微信、支付宝支付提现
前言: 本篇文章介绍关于自己写的一个集成微信.支付宝的支付.提现等功能的介绍,本项目已在码云上进行开源,欢迎大家一起来进行改造,使进行更好的创新供大家使用:也有对应的pom文件坐标可以导入,因目前不知 ...
- Java Web接入支付宝扫码付款API(使用SDK证书配置properties )
一.支付宝当面付功能Demo 官方文档https://docs.open.alipay.com/194/106078/ ps:因为沙箱环境一经配置了证书公钥则无法重置 第一步下载项目SKD&D ...
- 聊一聊Java如何接入招行一网通支付功能
1.前提条件 相比较于支付宝和微信的支付功能接入这一块,银行相对来说更加严格,比如说支付宝,在你签约之前可以进行一些测试.但是银行来说就不是这样了,如果您现在要进行招行的支付功能开发的话,请务必先让相 ...
随机推荐
- Mybatis与Spring整合(CURD)
项目采用Maven构建,用Junit进行测试,数据库是Mysql,连接池是c3p0,未测试缓存部分 1.Maven的“pom.xml”文件 <project xmlns="http:/ ...
- Centos7解压.tar.bz2提示tar (child): bzip2: Cannot exec: No such file or directory解决方法
Centos7解压.tar.bz2提示tar (child): bzip2: Cannot exec: No such file or directory解决方法 原因是因为该centos没有bzip ...
- IdentityServer_0_参考资料
官方 项目地址:https://github.com/IdentityServer/IdentityServer4 官方Demo:https://github.com/IdentityServer/I ...
- Codeforces 553E Kyoya and Train
题目大意 链接:CF533E 给一张\(n\)个点,\(m\)条边的图,起点\(1\)终点\(n\),如果不能在\(T\)的时间内到达则需支付\(X\)的代价. 走每条边都会支付一定代价,经过一条边\ ...
- 阿里云代码管理平台 Teambition Codeup(行云)亮相,为企业代码安全护航
2019杭州云栖大会企业协作与研发效能专场,企业协同平台Teambition负责人齐俊元正式发布阿里云自研的代码管理平台Teambition Codeup(行云),Codeup是一款企业级代码管理产品 ...
- day10 nfs服务,nginx负载均衡,定时任务
==================nginx 负载均衡==================== 实现nginx负载均衡的效果,并运用nfs服务共享目录,使所有nginx服务拥有共同的http目录 n ...
- 阿里云CentOs7上安装Tomcat
一.下载安装tomcat8 cd /usr/ #创建tomcat目录 mkdir tomcat #从网上download 压缩包 wget tomcat8 url #解压 tar -zxvf apac ...
- Java 12 正式发布,8大新特性!
自 2 月 7 日开始,Java/JDK 12 就进入了 RC 阶段.按照发布周期,美国当地时间 3 月 19 日,也就是北京时间 20 号 Java 12 正式发布了! △ JDK 12 GA 发布 ...
- Git初次使用,记录自己看
Git官网下载:https://git-scm.com/downloads 官网如果太慢,可以去这下载:http://www.wmzhe.com/soft-38801.html,注意选择如下图地址下载 ...
- MyBatis - 常用标签与动态Sql
MyBatis常用标签 ● 定义sql语句:select.insert.delete.update ● 配置JAVA对象属性与查询结构及中列明对应的关系:resultMap ● 控制动态sql拼接:i ...