p2p金融项目+支付宝充值
目录
前言
下载服务端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响应
调用顺序如下:
- 商户系统请求支付宝接口 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().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金融项目+支付宝充值相关推荐
- 黑马最新Android P2P金融项目开发实战 视频+项目源码
p2p金融项目,结合现有第三方应用市场上主流p2p金融理财产品特点,集成了新的技术与框架.该项目内容包含p2p金融理财业务流程,数据加密.解密,客户端异常信息上传,用户登录注册,数据的图表展示,第三方 ...
- 记录一下曾经写过的P2P金融项目-理财端(PC端)纯代码(续-服务消费者工程)
pom文件: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3 ...
- 金融支付 android 源码,Android P2P金融项目开发实战 视频+项目源码
p2p金融项目,结合现有第三方应用市场上主流p2p金融理财产品特点,集成了新的技术与框架.该项目内容包含p2p金融理财业务流程,数据加密.解密,客户端异常信息上传,用户登录注册,数据的图表展示,第三方 ...
- P2P金融项目(一)——项目介绍和系统架构
项目介绍 1.p2p金融介绍:一种互联网借款方式,p2p是person-to-person简写,表示个人与个人间的借贷交易 2.业务流程介绍: 3.业务模块介绍 该项目包含如下几个模块 会员注册.登录 ...
- 微信支付和支付宝支付时序图(p2p金融项目)
微信支付: 支付宝支付:
- 最新传智播客P2P金融项目网络借贷平台开发
课程大纲 itcast金融平台介绍 项目目标 1.掌握SSH开发技术(Spring data持久层开发) 2.熟悉项目开发,了解项目开发流程 3.简单掌握业务,使用技术来解决业务问题 4.掌握就业技术 ...
- P2P金融项目(二)——项目管理
gitee安装 1.下载地址 Git - Downloading Package 2.安装 下载完成后安装一直点next即可. 终端输入:whereis git可以查看git的安装位置. 3.如果输入 ...
- (未完)p2p金融项目+实名认证
完成注册后,跳转到"实名认证"页面 在header.jsp中,已登录 和 未登录,显示的是不一样的,所以要判断一下是否登录 金额不会放到session里,因为金额变化频率比较高,放 ...
- Android项目实战之尚硅谷_硅谷p2p金融
该项目是一年前夏天自己查阅网上资料并观看视频学习做的的android实战项目,经过这次自学android项目使自己在andorid开发的过程中收益匪浅,所以现在自己将此项目贴于网络用于自己回顾和想 ...
最新文章
- java 获取泛型t的class_阿里巴巴都鼎力推荐的java基础之集合其他内容和泛型3
- 面向对象设计原则之三:里氏替换原则
- leetcode算法第9题
- C# 系统应用之清除Cookies、IE临时文件、历史记录 转载
- 字节跳动《算法中文手册》完整版 PDF 开放下载!
- Spring AOP Capability and goals
- (推荐)为什么要走嵌入式?
- 存储器和寄存器数据传输(ARMv8)
- Spark GraphX相关使用方法
- 数值计算方法(一)——插值
- 【L298N 驱动电机的线路连接图】
- Unity3D丨面试题目
- Ros平台下:从零开始学习SLAM(序)
- 龙芯2F笔记本8089D
- 2021-04-30
- 计算机硬件实验报告怎么写,计算机硬件的认识与组装实验报告怎么写?
- 计算机运行内存和显卡内存不足,系统提示显卡内存不足怎么办?-解决系统提示显卡内存不足的方法 - 河东软件园...
- Python3的下载和安装步骤
- Flask 框架(四)— 表单处理
- dell客服(dell客服维修中心)