目录

前言

下载服务端SDK

时序图:

按照支付宝时序图的过程去做:

第一步:

第二步--2:生成充值记录(状态:充值中)

第四步:调支付宝的支付接口

第七+八步:(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响应

调用顺序如下:

  1. 商户系统请求支付宝接口 alipay.trade.page.pay,支付宝对商户请求参数进行校验,而后重新定向至用户登录页面。
  2. 用户确认支付后,支付宝通过 get 请求 returnUrl(商户入参传入),返回同步返回参数。
  3. 交易成功后,支付宝通过 post 请求 notifyUrl(商户入参传入),返回异步通知参数。
  4. 若由于网络等问题异步通知没有到达,商户可自行调用交易查询接口 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().getAttribute(Constants.SESSION_USER);

2、生成一个全局唯一充值订单号 = 时间戳 + redis全局唯一数字

String rechargeNo = DateUtils.getTimeStamp() + onlyNumberService.getOnlyNumber();

进入方法:

onlyNumberService.getOnlyNumber();

接口:OnlyNumberService

public interface OnlyNumberService {/*** 获取redis的全局唯一数字* @return*/Long getOnlyNumber();
}

实现类:onlyNumberServiceImpl

@Service("onlyNumberServiceImpl")
public class OnlyNumberServiceImpl implements OnlyNumberService {@Autowiredprivate RedisTemplate<Object,Object> redisTemplate;@Overridepublic Long getOnlyNumber() {return redisTemplate.opsForValue().increment(Constants.ONLY_NUMBER,1);}
}

3、生成充值记录(状态为:充值中)

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);

进入方法:addRechargeRecord(rechargeRecord);

接口:RechargeRecordService

/*** 新增充值记录* @param rechargeRecord* @return*/int addRechargeRecord(RechargeRecord rechargeRecord);

实现类:rechargeRecordServiceImpl

@Overridepublic int addRechargeRecord(RechargeRecord rechargeRecord) {return rechargeRecordMapper.insertSelective(rechargeRecord);}

再进入方法:rechargeRecordMapper.insertSelective(rechargeRecord);

具体的sql:新增充值记录

<insert id="insertSelective" parameterType="com.bjpowernode.p2p.model.loan.RechargeRecord"><!--WARNING - @mbggeneratedThis element is automatically generated by MyBatis Generator, do not modify.This element was generated on Mon Sep 17 09:12:20 CST 2018.-->insert into b_recharge_record<trim prefix="(" suffix=")" suffixOverrides=","><if test="id != null">id,</if><if test="uid != null">uid,</if><if test="rechargeNo != null">recharge_no,</if><if test="rechargeStatus != null">recharge_status,</if><if test="rechargeMoney != null">recharge_money,</if><if test="rechargeTime != null">recharge_time,</if><if test="rechargeDesc != null">recharge_desc,</if></trim><trim prefix="values (" suffix=")" suffixOverrides=","><if test="id != null">#{id,jdbcType=INTEGER},</if><if test="uid != null">#{uid,jdbcType=INTEGER},</if><if test="rechargeNo != null">#{rechargeNo,jdbcType=VARCHAR},</if><if test="rechargeStatus != null">#{rechargeStatus,jdbcType=VARCHAR},</if><if test="rechargeMoney != null">#{rechargeMoney,jdbcType=DOUBLE},</if><if test="rechargeTime != null">#{rechargeTime,jdbcType=TIMESTAMP},</if><if test="rechargeDesc != null">#{rechargeDesc,jdbcType=VARCHAR},</if></trim></insert>

4、--4(时序图中第4步)向pay工程的支付方法传递参数

前一步充值记录生成成功之后,向pay工程的支付方法传递参数

参数:充值订单号,充值金额,充值描述(支付宝充值)

//向pay工程的支付方法传递参数
model.addAttribute("p2p_pay_alipay_url","http://localhost:9090/pay/api/alipay");
model.addAttribute("rechargeNo",rechargeNo);
model.addAttribute("rechargeMoney",rechargeMoney);
model.addAttribute("subject","支付宝充值");

去第四步:调用支付宝的支付接口

5、如果3的充值记录没有生成 成功,那么“充值人数过多,请稍后重试。。。。。。”

model.addAttribute("trade_msg","充值人数过多,请稍后重试...");
return "toRechargeBack";

6、正常的返回

return "toAlipay";

第四步:调支付宝的支付接口

上一步,web工程向pay工程的支付方法传递参数,

pay工程:AlipayController

 1、参数

@RequestMapping(value = "/api/alipay")public String alipay(HttpServletRequest request, Model model,@RequestParam (value = "out_trade_no",required = true) String out_trade_no,//商户订单号,商户网站订单系统中唯一订单号,必填@RequestParam (value = "total_amount",required = true) Double total_amount,//付款金额,必填@RequestParam (value = "subject",required = true) String subject,//订单名称,必填@RequestParam (value = "body",required = true) String body) throws AlipayApiException {//订单名称,必填

参数:

  • 商户订单号,商户网站订单系统中唯一订单号,必填
  • 付款金额,必填
  • 订单名称,必填
  • 订单名称,必填

2、获得初始化的AlipayClient

AlipayClient alipayClient = new DefaultAlipayClient(payConfig.getAlipayGatewayUrl(),payConfig.getAlipayAppid(),payConfig.getMerchantPrivateKey(),payConfig.getAlipayFormat(),payConfig.getAlipayCharset(),payConfig.getAlipayPublicKey(),payConfig.getAlipaySignType());

3、设置请求参数

AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
//同步返回地址
alipayRequest.setReturnUrl(payConfig.getReturnUrl());
//异步返还地址
alipayRequest.setNotifyUrl(payConfig.getNotifyUrl());
alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","+ "\"total_amount\":\""+ total_amount +"\","+ "\"subject\":\""+ subject +"\","+ "\"body\":\""+ body +"\","+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");

4、请求并返回

//请求
String result = alipayClient.pageExecute(alipayRequest).getBody();System.out.println(result);model.addAttribute("result",result);
return "toAlipay";

5、p2p-pay下webapp下建立一个toAlipay.jsp:疯狂加载中

<%--Created by IntelliJ IDEA.User: guoxin@bjpowernode.comDate: 2018/9/26Time: 12:05To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>疯狂加载中...</title>
</head>
<body>
${result}
</body>
</html>

到目前为止,流程图中的4,调用支付宝的alipay.trade.page.pay支付接口已做完

第七+八步:(7)get请求returnURL,返回同步返还参数;(8)Pay将同步返还参数传递给p2p-web

p2p-pay:AlipayController.java

@RequestMapping(value = "/api/alipayBack")public String alipayBack(HttpServletRequest request,Model model) throws UnsupportedEncodingException, AlipayApiException {

1、获取支付宝GET过来反馈信息

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

2、调用SDK验证签名

boolean signVerified = AlipaySignature.rsaCheckV1(params,payConfig.getAlipayPublicKey(),payConfig.getAlipayCharset(),payConfig.getAlipaySignType());

3、提取要返回给web工程的参数:商户订单号、支付宝交易号、付款金额,是否成功

if(signVerified) {//商户订单号String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8");//支付宝交易号String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"),"UTF-8");//付款金额String total_amount = new String(request.getParameter("total_amount").getBytes("ISO-8859-1"),"UTF-8");model.addAttribute("signVerified","SUCCESS");model.addAttribute("params",params);}else {model.addAttribute("signVerified","FAIL");
}

4、返回web工程

model.addAttribute("pay_p2p_return_url","http://localhost:8080/p2p/loan/alipayBack");return "toP2P";

5、pay下创建toP2P.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--Created by IntelliJ IDEA.User: guoxin@bjpowernode.comDate: 2018/9/26Time: 14:39To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>疯狂加载中...</title>
</head>
<body>
<form action="${pay_p2p_return_url}" method="post"><input type="hidden" name="signVerified" value="${signVerified}"/><c:choose><c:when test="${not empty params}"><c:forEach items="${params}" var="paramMap"><input type="hidden" name="${paramMap.key}" value="${paramMap.value}"/></c:forEach></c:when></c:choose>
</form>
<script>document.forms[0].submit();</script>
</body>
</html>

第八步:p2p-web工程接收到Pay工程的同步返还参数后:

RechargeRecordController
@RequestMapping(value = "/loan/alipayBack")public String alipayBack(HttpServletRequest request,Model model,@RequestParam (value = "signVerified",required = true) String signVerified,@RequestParam (value = "out_trade_no",required = true) String out_trade_no,@RequestParam (value = "total_amount",required = true) Double total_amount) {System.out.println("-----------p2p-web------alipayBack-----------");

1、判断验证签名是否成功

if (StringUtils.equals(Constants.SUCCESS,signVerified)) {

2、若成功:调用pay工程的订单查询接口 -> 返回订单的状态

String jsonString = HttpClientUtils.doPost("http://localhost:9090/pay/api/alipayQuery", paramMap);

进入:http://localhost:9090/pay/api/alipayQuery

@RequestMapping(value = "/api/alipayQuery")public @ResponseBody Object alipayQuery(HttpServletRequest request,@RequestParam (value = "out_trade_no",required = true) String out_trade_no) throws AlipayApiException { //商户订单号,商户网站订单系统中唯一订单号//获得初始化的AlipayClientAlipayClient alipayClient = new DefaultAlipayClient(payConfig.getAlipayGatewayUrl(),payConfig.getAlipayAppid(),payConfig.getMerchantPrivateKey(),payConfig.getAlipayFormat(),payConfig.getAlipayCharset(),payConfig.getAlipayPublicKey(),payConfig.getAlipaySignType());//设置请求参数AlipayTradeQueryRequest alipayRequest = new AlipayTradeQueryRequest();alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\"}");//请求String result = alipayClient.execute(alipayRequest).getBody();return result;}

3、根据订单状态处理自己的业务

//获取通信标识codeString code = tradeQueryResponse.getString("code");//判断通信是否成功if (StringUtils.equals("10000",code)) {//通信成功:获取业务处理结果trade_statusString tradeStatus = tradeQueryResponse.getString("trade_status");/*交易状态:WAIT_BUYER_PAY(交易创建,等待买家付款)TRADE_CLOSED(未付款交易超时关闭,或支付完成后全额退款)TRADE_SUCCESS(交易支付成功)TRADE_FINISHED(交易结束,不可退款)*/if ("TRADE_CLOSED".equals(tradeStatus)) {//更新充值记录的状态为2充值失败RechargeRecord updateRechargeRecord = new RechargeRecord();updateRechargeRecord.setRechargeNo(out_trade_no);updateRechargeRecord.setRechargeStatus("2");int modifyRechargeCount = rechargeRecordService.modifyRechargeRecordByRechargeNo(updateRechargeRecord);if (modifyRechargeCount < 0) {model.addAttribute("trade_msg","充值人数过多,请稍后重试...");return "toRechargeBack";}}if ("TRADE_SUCCESS".equals(tradeStatus)) {User sessionUser = (User) request.getSession().getAttribute(Constants.SESSION_USER);paramMap.put("uid",sessionUser.getId());paramMap.put("rechargeNo",out_trade_no);paramMap.put("rechargeMoney",total_amount);//支付宝扣款成功:给用户充值【1.更新帐户可用余额 2.更新充值记录的状态为1充值成功】(用户标识,充值订单号,充值金额)int rechargeCount = rechargeRecordService.recharge(paramMap);if (rechargeCount < 0) {model.addAttribute("trade_msg","充值人数过多,请稍后重试...");return "toRechargeBack";}}} else {//通信失败model.addAttribute("trade_msg","通信失败,请稍后重试...");return "toRechargeBack";}

(1)获取通讯标识,如果通讯标识为10000,标识通讯成功

(2)如果成功:获取业务处理结果trade_status交易状态,

/*交易状态:
WAIT_BUYER_PAY(交易创建,等待买家付款)
TRADE_CLOSED(未付款交易超时关闭,或支付完成后全额退款)
TRADE_SUCCESS(交易支付成功)
TRADE_FINISHED(交易结束,不可退款)*/

(3)TRADE_CLOSED:更新充值记录的状态为2充值失败

 if ("TRADE_CLOSED".equals(tradeStatus)) {

(4)if ("TRADE_SUCCESS".equals(tradeStatus)) :

流程图11:支付宝扣款成功:给用户充值【1.更新帐户可用余额 2.更新充值记录的状态为1充值成功】(用户标识,充值订单号,充值金额)

//支付宝扣款成功:给用户充值【1.更新帐户可用余额 2.更新充值记录的状态为1充值成功】(用户标识,充值订单号,充值金额)
int rechargeCount = rechargeRecordService.recharge(paramMap);if (rechargeCount < 0) {model.addAttribute("trade_msg","充值人数过多,请稍后重试...");return "toRechargeBack";
}

进入方法:rechargeRecordService.recharge(paramMap);

@Overridepublic int recharge(Map<String, Object> paramMap) {//更新帐户可用余额int updateFinanceCount = financeAccountMapper.updateFinanceAccountByRecharge(paramMap);if (updateFinanceCount > 0) {//更新充值记录的状态RechargeRecord rechargeRecord = new RechargeRecord();rechargeRecord.setRechargeNo((String) paramMap.get("rechargeNo"));rechargeRecord.setRechargeStatus("1");int rechargeRecordByRechargeNo = rechargeRecordMapper.updateRechargeRecordByRechargeNo(rechargeRecord);if (rechargeRecordByRechargeNo < 0) {return 0;}} else {return 0;}return 1;}

4、最后充值成功,跳转:

return "redirect:/loan/myCenter";

p2p金融项目+支付宝充值相关推荐

  1. 黑马最新Android P2P金融项目开发实战 视频+项目源码

    p2p金融项目,结合现有第三方应用市场上主流p2p金融理财产品特点,集成了新的技术与框架.该项目内容包含p2p金融理财业务流程,数据加密.解密,客户端异常信息上传,用户登录注册,数据的图表展示,第三方 ...

  2. 记录一下曾经写过的P2P金融项目-理财端(PC端)纯代码(续-服务消费者工程)

    pom文件: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3 ...

  3. 金融支付 android 源码,Android P2P金融项目开发实战 视频+项目源码

    p2p金融项目,结合现有第三方应用市场上主流p2p金融理财产品特点,集成了新的技术与框架.该项目内容包含p2p金融理财业务流程,数据加密.解密,客户端异常信息上传,用户登录注册,数据的图表展示,第三方 ...

  4. P2P金融项目(一)——项目介绍和系统架构

    项目介绍 1.p2p金融介绍:一种互联网借款方式,p2p是person-to-person简写,表示个人与个人间的借贷交易 2.业务流程介绍: 3.业务模块介绍 该项目包含如下几个模块 会员注册.登录 ...

  5. 微信支付和支付宝支付时序图(p2p金融项目)

    微信支付: 支付宝支付:

  6. 最新传智播客P2P金融项目网络借贷平台开发

    课程大纲 itcast金融平台介绍 项目目标 1.掌握SSH开发技术(Spring data持久层开发) 2.熟悉项目开发,了解项目开发流程 3.简单掌握业务,使用技术来解决业务问题 4.掌握就业技术 ...

  7. P2P金融项目(二)——项目管理

    gitee安装 1.下载地址 Git - Downloading Package 2.安装 下载完成后安装一直点next即可. 终端输入:whereis git可以查看git的安装位置. 3.如果输入 ...

  8. (未完)p2p金融项目+实名认证

    完成注册后,跳转到"实名认证"页面 在header.jsp中,已登录 和 未登录,显示的是不一样的,所以要判断一下是否登录 金额不会放到session里,因为金额变化频率比较高,放 ...

  9. Android项目实战之尚硅谷_硅谷p2p金融

      该项目是一年前夏天自己查阅网上资料并观看视频学习做的的android实战项目,经过这次自学android项目使自己在andorid开发的过程中收益匪浅,所以现在自己将此项目贴于网络用于自己回顾和想 ...

最新文章

  1. java 获取泛型t的class_阿里巴巴都鼎力推荐的java基础之集合其他内容和泛型3
  2. 面向对象设计原则之三:里氏替换原则
  3. leetcode算法第9题
  4. C# 系统应用之清除Cookies、IE临时文件、历史记录 转载
  5. 字节跳动《算法中文手册》完整版 PDF 开放下载!
  6. Spring AOP Capability and goals
  7. (推荐)为什么要走嵌入式?
  8. 存储器和寄存器数据传输(ARMv8)
  9. Spark GraphX相关使用方法
  10. 数值计算方法(一)——插值
  11. 【L298N 驱动电机的线路连接图】
  12. Unity3D丨面试题目
  13. Ros平台下:从零开始学习SLAM(序)
  14. 龙芯2F笔记本8089D
  15. 2021-04-30
  16. 计算机硬件实验报告怎么写,计算机硬件的认识与组装实验报告怎么写?
  17. 计算机运行内存和显卡内存不足,系统提示显卡内存不足怎么办?-解决系统提示显卡内存不足的方法 - 河东软件园...
  18. Python3的下载和安装步骤
  19. Flask 框架(四)— 表单处理
  20. dell客服(dell客服维修中心)

热门文章

  1. 安装finalshell 高级版(绿色版)
  2. 谈谈激活函数以零为中心的问题
  3. 工业互联网-企业数据打通解决方案
  4. 阿里云Linux服务器如何打通网络
  5. 【Java 8 新特性】Java Comparator.naturalOrder | 自然排序
  6. 线性方程组(七)- 线性无关
  7. 这篇文章告诉你音频降噪手机软件app有哪些?
  8. Linux命令查看子进程命令,Linux基础命令——查看进程命令
  9. 稳健经营,龙光集团成为“中国地产上市公司财务稳健奖”获得者之一
  10. NetWorkx Python API