目录
第七+八步:(7)get请求returnURL,返回同步返还参数;(8)Pay将同步返还参数传递给p2p-web
第八步:p2p-web工程接收到Pay工程的同步返还参数后:
前言
如果要使用支付宝,前提是:是它的支付宝客户&&且有支付宝&&且实名认证过了
在Google中搜索:open.alipay.com “蚂蚁金服开放平台”
电脑网站支付:https://docs.open.alipay.com/270
这里出现了不对称的加密方式:应用公钥、应用私钥
在本地生成了一对 应用公钥和应用私钥,私钥自己留着,不能给别人,公钥给别人(支付宝网站),支付宝网站再对这个字符串(公钥)加密,返回给我(本地),我(本地)用私钥去解这个加密后的字符串,解密之后,匹配一下,是否相等
下载服务端SDK
什么是SDK:软件开发工具包,比如使用java的时候,用的软件开发工具包是JDK
拿着应用公钥生成一个支付宝公钥,支付宝公钥是由支付宝来生成的
时序图:
注意:实线代表request请求,虚线代表response响应
调用顺序如下:
- 商户系统请求支付宝接口 alipay.trade.page.pay,支付宝对商户请求参数进行校验,而后重新定向至用户登录页面。
- 用户确认支付后,支付宝通过 get 请求 returnUrl(商户入参传入),返回同步返回参数。
- 交易成功后,支付宝通过 post 请求 notifyUrl(商户入参传入),返回异步通知参数。
- 若由于网络等问题异步通知没有到达,商户可自行调用交易查询接口 alipay.trade.query 进行查询,根据查询接口获取交易以及支付信息(商户也可以直接调用查询接口,不需要依赖异步通知)。
注意:
- 由于同步返回的不可靠性,支付结果必须以异步通知或查询接口返回为准,不能依赖同步跳转。
- 商户系统接收到异步通知以后,必须通过验签(验证通知中的 sign 参数)来确保支付通知是由支付宝发送的。详细验签规则参考异步通知验签。
- 接收到异步通知并验签通过后,一定要检查通知内容,包括通知中的 app_id、out_trade_no、total_amount 是否与请求中的一致,并根据 trade_status 进行后续业务处理。
- 在支付宝端,partnerId 与 out_trade_no 唯一对应一笔单据,商户端保证不同次支付 out_trade_no 不可重复;若重复,支付宝会关联到原单据,基本信息一致的情况下会以原单据为准进行支付。
按照支付宝时序图的过程去做:
第一步:
在p2p-web中的pom.xml添加依赖:
<!-- 阿里巴巴json解析包start -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
还有SDK的jar包,如何在maven项目中引入非本地仓库的jar包:
在WED-INF下建一个lib文件夹
。。。。。。。。。。
第二步--2:生成充值记录(状态:充值中)
p2p-web
RechargeRecordController.java
@RequestMapping(value = "/loan/toAlipayRecharge")
public String toAlipayRecharge(HttpServletRequest request, Model model,
@RequestParam (value = "rechargeMoney",required = true) Double rechargeMoney) {
//从session中获取用户的信息
User sessionUser = (User) request.getSession().getAttribute(Constants.SESSION_USER);
//生成一个全局唯一充值订单号 = 时间戳 + redis全局唯一数字
String rechargeNo = DateUtils.getTimeStamp() + onlyNumberService.getOnlyNumber();
//生成充值记录(状态为:充值中)
RechargeRecord rechargeRecord = new RechargeRecord();
rechargeRecord.setUid(sessionUser.getId());
rechargeRecord.setRechargeNo(rechargeNo);
rechargeRecord.setRechargeMoney(rechargeMoney);
rechargeRecord.setRechargeTime(new Date());
rechargeRecord.setRechargeStatus("0");
rechargeRecord.setRechargeDesc("支付宝充值");
int addRechargeCount = rechargeRecordService.addRechargeRecord(rechargeRecord);
if (addRechargeCount > 0) {
//向pay工程的支付方法传递参数
model.addAttribute("p2p_pay_alipay_url","http://localhost:9090/pay/api/alipay");
model.addAttribute("rechargeNo",rechargeNo);
model.addAttribute("rechargeMoney",rechargeMoney);
model.addAttribute("subject","支付宝充值");
} else {
model.addAttribute("trade_msg","充值人数过多,请稍后重试...");
return "toRechargeBack";
}
return "toAlipay";
}
过程:
1、先从session中获取用户的信息
User sessionUser = (User) request.getSession().getAt