Java后端对接支付(小程序、APP、PC端扫码)包含查单退款
Java后端对接⽀付(⼩程序、APP、PC端扫码)包含查单退款
⽬录
中国与俄罗斯的时差
1.三种⽀付统⼀准备⼯作
2.JSAPI统⼀下单
3.NATIVE统⼀下单
4.APP统⼀下单
5.三种⽀付⽅式返回结果
6.查单
7.退款
8.补充
⾸先我们要明确⽬标,我们点击,我们主要聚焦于这三种⽀付⽅式,其中JSPAI与APP主要与uniapp开发⼩程序与APP对接,⽽NATIVE主要与⽹页端扫码⽀付对接
1.三种⽀付统⼀准备⼯作
建议导⼊这个jar,⾥⾯⼀些提供map和xml互转以及⽣成签名的函数,使⽤⾮常⽅便。
<dependency>
<groupId>com.github.wxpay</groupId>
<artifactId>wxpay-sdk</artifactId>
<version>0.0.3</version>
</dependency>
ps:下⾯代码涉及到的WXPayUtil下⾯的函数都是这个⼯具包⾥来的,所以不要再问这个函数代码在哪
商户号与⽀付结果通知回调地址
回调url配置途径:
商户平台(pay.weixin.qq)-->产品中⼼-->开发配置-->⽀付配置
既然涉及到维信⼩程序和app,那么它们的app_id是必须的
统⼀下单、查单、退款的API地址,去官⽅⽂档即可,我这⾥直接写好了
/**
* 统⼀下单接⼝
*/
public static final String UNIFIED_ORDER_URL = "h.weixin.qq/pay/unifiedorder";
/**
* 查询订单接⼝
*/
public static final String ORDER_QUERY_URL = "h.weixin.qq/pay/orderquery";
/**
* 订单退款接⼝
*/
小学教师个人总结public static final String ORDER_REFUND_URL = "h.weixin.qq/secapi/pay/refund";
API密钥
怎么删除桌面图标⽤于签名算法
获取途径
商户平台(pay.weixin.qq)-->账户中⼼-->账户设置-->API安全-->设置API密钥
2.JSAPI统⼀下单
这种⽀付的使⽤场景,我们这⾥是对接uniapp开发的⼩程序
我们仔细阅读⽂档并提取信息,其实访问接⼝的很多参数都不是必填的,我们尽量去关注必填参数
归纳如下:
appid⼩程序app_idmch_id商户号nonce_str随机字符串,可以调⽤WXPayUtil下generateNonceStr⽅法⽣成sign
可以调⽤WXPayUtil下generateSignature⽅法⽣成,这个⽅法需要⽤到准备⼯作中的商户API密钥(APP_KEY)来加密。
但是下完单之后,怎么样才能让前端调⽤⽀付呢?这⾥需要查看uniapp⼩程序⽀付
我们发现其实主要是拿到预⽀付id prepay_id以及签名。
代码实现:
public Map<String, String> unifiedOrderByJsp(Order order, String clientIp) throws Exception {
long begin = System.currentTimeMillis();
//使⽤map封装⽀付需要的固定参数
Map<String, String> m = new HashMap<>();
//设置⽀付参数
m.put("appid", OrderUtils.WX_APP_ID);
m.put("mch_id", OrderUtils.MCH_ID);
m.put("nonce_str", ateNonceStr());
//商品描述例如:天天爱消除-游戏充值
m.put("body", "换芯易-" + GoodsModel() + "购买");
//订单号
m.put("out_trade_no", OrderSn());
m.put("total_fee", ActualPrice().multiply(new BigDecimal("100")).longValue() + "");
m.put("spbill_create_ip", clientIp);
m.put("notify_url", OrderUtils.NOTIFY_URL);
m.put("trade_type", "JSAPI");
//trade_type=JSAPI时(即JSAPI⽀付),必须要openid
UserThreeDao userThreeDao = new UserThreeDaoImpl();
UserThree userThree = userThreeDao.UserId());
if (userThree == null) {
return null;
}
m.put("openid", ThreeOpenid());
//⽣成签名
m.put("sign", ateSignature(m, OrderUtils.APP_KEY));
//发送请求,请求路径:UNIFIED_ORDER_URL = "h.weixin.qq/pay/unifiedorder"
HttpClient client = new HttpClient(OrderUtils.UNIFIED_ORDER_URL);
//设置xml格式的参数,要把map转为xml
client.setXmlParam(WXPayUtil.mapToXml(m));
//设置⽀持https
client.setHttps(true);
/
/执⾏请求发送
client.post();
//xml转为map接受结果
教师见习期工作总结Map<String, String> response = Content());
long end = System.currentTimeMillis();
System.out.println("请求h.weixin.qq/pay/unifiedorder耗时:" + (end - begin) + "ms");
System.out.println("请求结果:" + JSONString(response));
if ("SUCCESS".("return_code")) && "SUCCESS".("result_code"))) {            Map<String, String> param = new HashMap<>();
//返回结果格式参照uniapp.dcloud.io/api/plugins/payment?id=requestpayment
//随机字符串
//时间戳,但是单位为s,不是毫秒
param.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000));
param.put("nonceStr", ateNonceStr());
param.put("package", "prepay_id=" + ("prepay_id"));
param.put("signType", "MD5");
param.put("paySign", ateSignature(param, OrderUtils.APP_KEY));
return param;
}
//为空代表下单失败
return null;
}
3.NATIVE统⼀下单
主要应⽤场景是PC端扫码⽀付。
必填参数归纳如下:
appid⼩程序app_id
mch_id商户号
nonce_str随机字符串,可以调⽤WXPayUtil下generateNonceStr⽅法⽣成
sign可以调⽤WXPayUtil下generateSignature⽅法⽣成,这个⽅法需要⽤到准备⼯作中的商户API密钥(APP_KEY)来加密。body商品描述,建议软件名字+产品操作,例如天天爱消除-游戏充值
out_trade_no我们⾃⼰⽣成的订单号,保证同⼀商号下唯⼀即可
total_fee⾦额,注意单位是分
spbill_create_ip⽤户客户端ip
notify_url⽀付结果通知回调地址
trade_type交易类型,我们这⾥填NATIVE
product_id trade_type=NATIVE时,此参数必传。此参数为⼆维码中包含的商品ID,我们可以⾃⾏定义。
代码如下:
public Map<String, String> unifiedOrderByNative(Order order,  String clientIp) throws Exception {
long begin = System.currentTimeMillis();
//使⽤map封装⽀付需要的固定参数
Map<String, String> m = new HashMap<>();
//1、设置⽀付参数
m.put("appid", OrderUtils.WX_APP_ID);
m.put("mch_id", OrderUtils.MCH_ID);
m.put("nonce_str", ateNonceStr());
//商品描述例如:天天爱消除-游戏充值
m.put("body", "换芯易-" + GoodsModel() + "购买");
//订单号
m.put("out_trade_no", OrderSn());
m.put("total_fee", ActualPrice().multiply(new BigDecimal("100")).longValue() + "");
m.put("spbill_create_ip", clientIp);
m.put("notify_url", OrderUtils.NOTIFY_URL);
m.put("trade_type", "NATIVE");
//trade_type=NATIVE时,此参数必传
m.put("product_id", Id());
//⽣成签名
m.put("sign", ateSignature(m, OrderUtils.APP_KEY));
//发送请求,请求路径:UNIFIED_ORDER_URL = "h.weixin.qq/pay/unifiedorder"
HttpClient client = new HttpClient(OrderUtils.UNIFIED_ORDER_URL);
//设置xml格式的参数,要把map转为xml
client.setXmlParam(WXPayUtil.mapToXml(m));
//设置⽀持https贾静雯 欧弟
client.setHttps(true);
//执⾏请求发送
client.post();
//xml转为map接受结果
Map<String, String> response = Content());
long end = System.currentTimeMillis();
System.out.println("请求h.weixin.qq/pay/unifiedorder耗时:" + (end - begin) + "ms");
System.out.println("请求结果:" + JSONString(response));
if ("SUCCESS".("return_code")) && "SUCCESS".("result_code"))) {
Map<String, String> param = new HashMap<>();
//⼆维码地址
param.put("code_url", ("code_url"));
param.put("order_sn", OrderSn());
param.put("order_id", Id());
param.put("total_fee", ActualPrice().multiply(new BigDecimal("100")).longValue() + "");
return param;
}
//为空代表下单失败
return null;
}
上⾯代码中最重要的返回结果就是code_url。即⽣成的⽀付⼆维码地址,然后⽤扫码并付款即可。
4.APP统⼀下单
应⽤场景是APP端调⽤⽀付,对接uniapp开发的app
归纳如下:
appid APP的app_id高档车
mch_id商户号
nonce_str随机字符串,可以调⽤WXPayUtil下generateNonceStr⽅法⽣成
sign可以调⽤WXPayUtil下generateSignature⽅法⽣成,这个⽅法需要⽤到准备⼯作中的商户API密钥(APP_KEY)来加密。body商品描述,建议软件名字+产品操作,例如天天爱消除-游戏充值
out_trade_no我们⾃⼰⽣成的订单号,保证同⼀商号下唯⼀即可
total_fee⾦额,注意单位是分
spbill_create_ip⽤户客户端ip
notify_url⽀付结果通知回调地址
trade_type交易类型,我们这⾥填APP
但是下完单之后,怎么样才能让前端调⽤⽀付呢?这⾥需要查看uniapp⼩程序⽀付:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。