支付功能3具体有哪些特色和优势,能详细介绍一下吗?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1400个文字,预计阅读时间需要6分钟。
1. 内网穿透完整测试程序:使用ngrok,直接注册一个账户开通隧道即可,简单方便。KuaiQianService
2.微信支付://服务器接收支付结果的后台地址,该参数业务必填,不能为空。//String bgUrl
1.内网穿透完整测试程序180
我们使用ngrok,直接注册一个账号开通隧道即可,简单方便
KuaiQianService181
micr-pay
//服务器接收支付结果的后台地址,该参数务必填写,不能为空。
//String bgUrl = "localhost:9000/pay/kq/rece/notify";
String bgUrl = "oayunshang3.v1.idcfengye.com/pay/kq/rece/notify";//内网穿透地址 181
KuaiQianController181
micr-pay
//接收快钱给商家的支付结果 , 快钱以get方式,发送请求给商家 170
@GetMapping("/rece/notify")
@ResponseBody
public String payResultNotify(HttpServletRequest request){
System.out.println("==============接收快钱的异步通知============");//181
kQService.kqNotify(request);
return "<result>1</result><redirecturl>localhost:8080/</redirecturl>";
}
测试181
启动micr-datasevice、micr-web、micr-pay
运行ngrok内网穿透
启动redis
启动zookeeper
测试我们用到的信息
测试银行卡:
可用的银行卡:
6214 6800 3838 7096 北京银行的
姓名:张峰
身份证 110101199105149839
测试环境:不对卡,姓名,身份证做检查, 正式环境会检查。
支付一分钱,点击支付
跳转到快钱支付界面,更换信息
点击返回商家
成功
看看后台输出,没问题
看看数据库资金表,增加了一分钱
充值记录表也没问题
再次进入用户中心,查询到一条充值记录
至此我们整个支付程序,成功
2.补单处理182
补单查询快钱响应的数据格式
我们主要是获取这部分数据
{
"recordCount": "30",
"pageCount": "1",
"orderDetail": [
{
"orderId": "1642244020946593",
"orderAmount": 3,
"orderTime": "20120605012740",
"dealTime": "20120605013104",
"payResult": "10",
"payType": "10",
"payAmount": 3,
"fee": 1,
"dealId": "23023847",
"signInfo":
"jGf9%2F7vKOUkK%2B93ZcTxT9IOFoEhxSEDHmwKbdtEJuEHd4DhPU3BlotuujtHIHlaEPHp48t8c0uj78TzD
M%2FUQeaH15o5DNmdRencMD0mo%2FmSRNEHtqgOZfY3H3VR4SbYUDgIf7YVAspBoK3re3feroGGUA8%2BKue8
%2BgzPOjp%2Fgkkeh4GuA4KAAnunTuxELc82rsP0CuosawodILiHTvDwoyF1EgAIQqEChgdHbpQUtiCevluYK
ORmwZJlN804L8GPmobMZXr4CVtVTYcGuOIUXzz4ImXEnfesCP2f6BOoJD14SIxU%2BrWHppByEKtKodUCJ7FA
0pxCB6uqHUE3eNHuw1Q%3D%3D"
}
],
"signMsg":
"f3oEXOdTflGvJScrHZbjQQgz3RTwSnLTvHTJn0GUHcAAIjnXfN2rV79gWbEwRExkFfFq%2FEXl29%2Fw5ID3
cfalx4hGqktXARUqf0WYKTz%2B3Un8%2Bv2vtcMXzfQAopKnPSAawZJ2CTWwSq9xkWxlTZj%2B7%2Bj1n9maa
dCAVwsaNUFZN%2FT4t%2BqqMsI8wAfk%2FFcSwcwo2CDr%2F%2Bp2WQ3sQbVYDBd4hFa3s3Q24zeH9u7x9cZp
2gNS7UdERTe7ksBjuhImnoJahNOP5WIzxZaXNpDFNwa0qjRhVFzMs97T7aa8M4LOhaI%2F8mesYGa8D50VlvY
8GtApr%2F3CebFKRf8uU1XGqfZsXA%3D%3D",
"signType": 2,
"pageSize": "30",
"merchantAcctId": "1001162931901",
"errCode": "",
"currentPage": "1",
"version": "v2.0"
}
2.1业务接口实现类KuaiQianService183
工具类HttpUtil183
micr-pay
资源在E:\java学习\盈利宝\资料\资料\10-快钱支付\人民币网关\DEMO\JAVA\人民币网关支付、退款查询\HttpQuery\src\com\query\Test
package com.bjpowernode.util;
import java.net.SocketTimeoutException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.sandbox.99bill.com/gatewayapi/gatewayOrderQuery.do";
String response = "";
try {
response = HttpUtil.doPostJsonRequestByHttps(JSON.toJSONString(request), reqUrl, 3000, 8000);
//解析response 183-184
if(StringUtils.isNotBlank(response)){
Object detailObject = JSONObject.parseObject(response).get("orderDetail");
System.out.println("detailObject===="+detailObject);
if( detailObject != null){
//把查询的Object转为JSONArray
//解释orderDetail部分数据,本身是一个数组被放在了json中
///我们将得到的detailObject对象转为json的数组形式
JSONArray array = (JSONArray)detailObject;
//取出json数组的第一个元素 184
JSONObject detailJsonObject = array.getJSONObject(0);
if( detailJsonObject != null){
//处理充值结果,和异步通知一样 184
int result = rechargeService.handleKQNotify(
detailJsonObject.getString("orderId"),//订单号
detailJsonObject.getString("payAmount"),//实付金额
detailJsonObject.getString("payResult")//支付结果
);
System.out.println("处理的订单号是:"+orderId+",处理结果:"+result);
}
}
}
//删除redis中的订单 184
stringRedisTemplate.boundZSetOps(RedisKey.KEY_ORDERID_SET).remove(orderId);
} catch (Exception e) {
e.printStackTrace();
return;
}
}
2.2控制controller183
KuaiQianController
micr-pay
//补单操作 183
//从定时任务,调用接口 183
@GetMapping("/rece/query")
@ResponseBody
public String queryKQOrder(){
kQService.handlerQueryOrder();
return "接收了查询的请求";
}
2.3在定时任务中掉用184
TaskManager184
micr-task
//调用查询补单接口 184
@Scheduled(cron = "0 0/20 * * * ?")//每隔20分钟查询一次
public void invokeKuaiQianQuery(){
try {
String url = "localhost:9000/pay/kq/rece/query";
HttpClientUtils.doGet(url);
}catch (Exception e){
e.printStackTrace();
}
}
启动类184
micr-task
2.4测试185
为了方便测试我们从数据库中拷贝一个已经处理过的订单
将订单号拷贝进redis
启动micr-datasevice、micr-web、micr-task、debug启动micr-pay
运行ngrok内网穿透
启动redis
启动zookeeper
在程序遍历第一个订单时也就是红框,因为这个数据没有向快钱发起过支付请求,所以补单查询响应回来的数据orderDetail为空
当遍历到尾号819时,因为这个订单号是之前处理的,所以
处理结果为3证明已经处理过了,所以即便是orderDetail有数据,也不会处理
看看redis,存储订单的redis消失了,成功(因为我们程序设计的即使从redis去一个进行查询补单,就删除一个)
看看数据库819数据没有任何影响
资金表,资金也没有变化,成功
至此,本项目完结
3.总结186
4.项目总体测试
4.1启动redis
4.2启动zookeeper
4.3首先启动micr-dataservice、micr-web、micr-pay
4.4启动内网穿透
(注意自己内网穿透使用的地址,要注意内网过期,过期的话就不要使用内网穿透了,去程序汇中修改KuaiQianService类的generateFormData的bgUrl属性就是了)
4.5启动前端
4.6测试
浏览器输入localhost:8080/
后续测试不在演示
本文共计1400个文字,预计阅读时间需要6分钟。
1. 内网穿透完整测试程序:使用ngrok,直接注册一个账户开通隧道即可,简单方便。KuaiQianService
2.微信支付://服务器接收支付结果的后台地址,该参数业务必填,不能为空。//String bgUrl
1.内网穿透完整测试程序180
我们使用ngrok,直接注册一个账号开通隧道即可,简单方便
KuaiQianService181
micr-pay
//服务器接收支付结果的后台地址,该参数务必填写,不能为空。
//String bgUrl = "localhost:9000/pay/kq/rece/notify";
String bgUrl = "oayunshang3.v1.idcfengye.com/pay/kq/rece/notify";//内网穿透地址 181
KuaiQianController181
micr-pay
//接收快钱给商家的支付结果 , 快钱以get方式,发送请求给商家 170
@GetMapping("/rece/notify")
@ResponseBody
public String payResultNotify(HttpServletRequest request){
System.out.println("==============接收快钱的异步通知============");//181
kQService.kqNotify(request);
return "<result>1</result><redirecturl>localhost:8080/</redirecturl>";
}
测试181
启动micr-datasevice、micr-web、micr-pay
运行ngrok内网穿透
启动redis
启动zookeeper
测试我们用到的信息
测试银行卡:
可用的银行卡:
6214 6800 3838 7096 北京银行的
姓名:张峰
身份证 110101199105149839
测试环境:不对卡,姓名,身份证做检查, 正式环境会检查。
支付一分钱,点击支付
跳转到快钱支付界面,更换信息
点击返回商家
成功
看看后台输出,没问题
看看数据库资金表,增加了一分钱
充值记录表也没问题
再次进入用户中心,查询到一条充值记录
至此我们整个支付程序,成功
2.补单处理182
补单查询快钱响应的数据格式
我们主要是获取这部分数据
{
"recordCount": "30",
"pageCount": "1",
"orderDetail": [
{
"orderId": "1642244020946593",
"orderAmount": 3,
"orderTime": "20120605012740",
"dealTime": "20120605013104",
"payResult": "10",
"payType": "10",
"payAmount": 3,
"fee": 1,
"dealId": "23023847",
"signInfo":
"jGf9%2F7vKOUkK%2B93ZcTxT9IOFoEhxSEDHmwKbdtEJuEHd4DhPU3BlotuujtHIHlaEPHp48t8c0uj78TzD
M%2FUQeaH15o5DNmdRencMD0mo%2FmSRNEHtqgOZfY3H3VR4SbYUDgIf7YVAspBoK3re3feroGGUA8%2BKue8
%2BgzPOjp%2Fgkkeh4GuA4KAAnunTuxELc82rsP0CuosawodILiHTvDwoyF1EgAIQqEChgdHbpQUtiCevluYK
ORmwZJlN804L8GPmobMZXr4CVtVTYcGuOIUXzz4ImXEnfesCP2f6BOoJD14SIxU%2BrWHppByEKtKodUCJ7FA
0pxCB6uqHUE3eNHuw1Q%3D%3D"
}
],
"signMsg":
"f3oEXOdTflGvJScrHZbjQQgz3RTwSnLTvHTJn0GUHcAAIjnXfN2rV79gWbEwRExkFfFq%2FEXl29%2Fw5ID3
cfalx4hGqktXARUqf0WYKTz%2B3Un8%2Bv2vtcMXzfQAopKnPSAawZJ2CTWwSq9xkWxlTZj%2B7%2Bj1n9maa
dCAVwsaNUFZN%2FT4t%2BqqMsI8wAfk%2FFcSwcwo2CDr%2F%2Bp2WQ3sQbVYDBd4hFa3s3Q24zeH9u7x9cZp
2gNS7UdERTe7ksBjuhImnoJahNOP5WIzxZaXNpDFNwa0qjRhVFzMs97T7aa8M4LOhaI%2F8mesYGa8D50VlvY
8GtApr%2F3CebFKRf8uU1XGqfZsXA%3D%3D",
"signType": 2,
"pageSize": "30",
"merchantAcctId": "1001162931901",
"errCode": "",
"currentPage": "1",
"version": "v2.0"
}
2.1业务接口实现类KuaiQianService183
工具类HttpUtil183
micr-pay
资源在E:\java学习\盈利宝\资料\资料\10-快钱支付\人民币网关\DEMO\JAVA\人民币网关支付、退款查询\HttpQuery\src\com\query\Test
package com.bjpowernode.util;
import java.net.SocketTimeoutException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.sandbox.99bill.com/gatewayapi/gatewayOrderQuery.do";
String response = "";
try {
response = HttpUtil.doPostJsonRequestByHttps(JSON.toJSONString(request), reqUrl, 3000, 8000);
//解析response 183-184
if(StringUtils.isNotBlank(response)){
Object detailObject = JSONObject.parseObject(response).get("orderDetail");
System.out.println("detailObject===="+detailObject);
if( detailObject != null){
//把查询的Object转为JSONArray
//解释orderDetail部分数据,本身是一个数组被放在了json中
///我们将得到的detailObject对象转为json的数组形式
JSONArray array = (JSONArray)detailObject;
//取出json数组的第一个元素 184
JSONObject detailJsonObject = array.getJSONObject(0);
if( detailJsonObject != null){
//处理充值结果,和异步通知一样 184
int result = rechargeService.handleKQNotify(
detailJsonObject.getString("orderId"),//订单号
detailJsonObject.getString("payAmount"),//实付金额
detailJsonObject.getString("payResult")//支付结果
);
System.out.println("处理的订单号是:"+orderId+",处理结果:"+result);
}
}
}
//删除redis中的订单 184
stringRedisTemplate.boundZSetOps(RedisKey.KEY_ORDERID_SET).remove(orderId);
} catch (Exception e) {
e.printStackTrace();
return;
}
}
2.2控制controller183
KuaiQianController
micr-pay
//补单操作 183
//从定时任务,调用接口 183
@GetMapping("/rece/query")
@ResponseBody
public String queryKQOrder(){
kQService.handlerQueryOrder();
return "接收了查询的请求";
}
2.3在定时任务中掉用184
TaskManager184
micr-task
//调用查询补单接口 184
@Scheduled(cron = "0 0/20 * * * ?")//每隔20分钟查询一次
public void invokeKuaiQianQuery(){
try {
String url = "localhost:9000/pay/kq/rece/query";
HttpClientUtils.doGet(url);
}catch (Exception e){
e.printStackTrace();
}
}
启动类184
micr-task
2.4测试185
为了方便测试我们从数据库中拷贝一个已经处理过的订单
将订单号拷贝进redis
启动micr-datasevice、micr-web、micr-task、debug启动micr-pay
运行ngrok内网穿透
启动redis
启动zookeeper
在程序遍历第一个订单时也就是红框,因为这个数据没有向快钱发起过支付请求,所以补单查询响应回来的数据orderDetail为空
当遍历到尾号819时,因为这个订单号是之前处理的,所以
处理结果为3证明已经处理过了,所以即便是orderDetail有数据,也不会处理
看看redis,存储订单的redis消失了,成功(因为我们程序设计的即使从redis去一个进行查询补单,就删除一个)
看看数据库819数据没有任何影响
资金表,资金也没有变化,成功
至此,本项目完结
3.总结186
4.项目总体测试
4.1启动redis
4.2启动zookeeper
4.3首先启动micr-dataservice、micr-web、micr-pay
4.4启动内网穿透
(注意自己内网穿透使用的地址,要注意内网过期,过期的话就不要使用内网穿透了,去程序汇中修改KuaiQianService类的generateFormData的bgUrl属性就是了)
4.5启动前端
4.6测试
浏览器输入localhost:8080/
后续测试不在演示

