基于uni-app开发⼩程序⽀付功能(后端为Java的SSM框
架)
⼀、申请公众平台、商户号
1、⾸先需要去公众平台注册企业级⼩程序,个⼈账号是⽆法进⾏认证,没有认证的账号⽆法申请⼩程序⽀付功能(认证⼀次需要300元和⼀系列给腾讯账号打钱环节,太坑了,每次打钱⼏⽑钱,⼿续费好⼏块),注册成功后会分配⼩程序的appID,后续对接⽀付时要⽤到。之后则可以申请⽀付,需要⾃⼰去申请商户号然后绑定⼩程序的appID。
2、申请商户号流程⽹上可以搜到,或者按照腾讯的步骤⼀步⼀步也能申请成功,这个不是很难。申请成功后,还需要填写⼀些基本设置都是程序中要⽤到的数据,⽐如商户平台的密钥key,之后可以绑定好⼩程序的ID,然后就可以设置⽀付了。在产品中⼼---》AppID账号管理⾥⾯关联⼩程序。
有趣的java小程序在我的产品中开通JSAPI⽀付权限
后端接收到后做⼀系列的处理。该地址必须是公⽹地址,域名可以是带端⼝号,亲测可以。http协议可以使⽤,建议是使⽤https。
以上设置完成即可。
⼆、uni-app+SSM框架对接⽀付
1、⾸先需要在⽀付页⾯的onLoad⽅法中调⽤uni.login来获取当前⽤户的code值,然后调⽤获取openID的⽅法。
onLoad() {
const that=this
uni.login({
success: res => {
//code值(5分钟失效)
console.de);
}
});
}
2、通过⽤户的code值调⽤Java后端接⼝,来获得openID。
async getOpenId(data){
let jss = this.$store.state.user.JSESSIONID;
let param = {
mobileLogin: true,
JSESSIONID: jss,
code:data,
};
let type = Openid;
try {
//调⽤接⼝得到返回的openID
var res = await RS.RequestServer.fetch(type, param);
} catch (e) {
console.log(e)
uni.showToast({
title: e.msg || e.errMsg,
duration: 500,
})
}
this.openid=res.data.body.openid
}
3、Java后端获取到code值,调⽤提供的接⼝来获取openID
@ResponseBody
@RequestMapping(value = "getOpenid")
public AjaxJson getOpenid(String code) throws IOException {
AjaxJson j = new AjaxJson();
//wx接⼝路径
String url = "api.weixin.qq/sns/jscode2session?grant_type=authorization_code&" +"appid=" + APPID + "&secret=" + SECRET + "&js_code=" + cod //使⽤HttpClient发送请求
CloseableHttpClient httpclient = ateDefault();
//发送Get请求
HttpGet request = new HttpGet(url);
request.addHeader("Content-Type", "application/json");
//获得响应
CloseableHttpResponse response = ute(request);
//拿到响应体
HttpEntity httpEntity = Entity();
//使⽤⼯具转换
String result = String(httpEntity, "UTF-8");// 转成string
JSONObject jsonObject = JSONObject.parseObject(result);
System.out.println(jsonObject);//拿到的所有内容
String openid = ("openid").toString();
System.out.println(openid);//拿到的openid
j.setSuccess(true);
j.put("openid", openid);
return j;
}
4、当⽤户输⼊⾦额,点击提交按钮,则需要把⾦额、openID先发送到后端进⾏处理,后端接收后⽣成订单然后调⽤接⼝把这些信息发
送过去,发送之后把⽣成的订单信息反馈到⽀付页⾯,然后把这些信息放到questPayment⾥⾯。
async commit() {
let jss = this.$store.state.user.JSESSIONID;
let username = this.$store.state.user.username;
var that=this
uni.showLoading()
let param = {
mobileLogin: true,
JSESSIONID: jss,
,
openid:this.openid,
};
//调⽤接⼝把⾦额和openid发送到后端进⾏处理
let type = derResult;
try {
var res = await RS.RequestServer.fetch(type, param);
} catch (e) {
console.log(e)
uni.showToast({
title: e.msg || e.errMsg,
duration: 500,
})
}
console.log(res)
//把得到的结果取出来,然后调⽤questPayment,则会弹出填写⽀付密码的页⾯,⽀付成功则调⽤success,⽀付失败则调⽤fail。 const configdata=res.derResult
provider: 'wxpay',
appId:configdata.appId,
timeStamp: configdata.timeStamp,
nonceStr: Str,
package: configdata.package,
signType: "MD5",
paySign: configdata.paySign,
success: function(res) {
console.log('success:' + JSON.stringify(res));
},
fail: function(err) {
console.log('fail:' + JSON.stringify(err));
}
});
uni.hideLoading()
}
5、Java后端的orderResult接⼝和回调⽅法,⾥⾯包含了⼀些处理数据的⽅法,所有处理⽀付的⽅法都在⾥⾯。
@Controller
@RequestMapping(value = "${adminPath}/miniprogram/miniprogram")
public class MiniprogramConfig extends BaseController {
//⼩程序appid ,需要改为真实的
private final static String APPID = "";
//⼩程序secret ,需要改为真实的
private final static String SECRET = "";
@ResponseBody
@RequestMapping(value = "getOpenid")
public AjaxJson getOpenid(String code) throws IOException {
AjaxJson j = new AjaxJson();
//wx接⼝路径
String url = "api.weixin.qq/sns/jscode2session?grant_type=authorization_code&" +
"appid=" + APPID + "&secret=" + SECRET + "&js_code=" + code;
"appid=" + APPID + "&secret=" + SECRET + "&js_code=" + code;
//使⽤HttpClient发送请求
CloseableHttpClient httpclient = ateDefault();
//发送Get请求
HttpGet request = new HttpGet(url);
request.addHeader("Content-Type", "application/json");
//获得响应
CloseableHttpResponse response = ute(request);
//拿到响应体
HttpEntity httpEntity = Entity();
//使⽤⼯具转换
String result = String(httpEntity, "UTF-8");// 转成string
JSONObject jsonObject = JSONObject.parseObject(result);
System.out.println(jsonObject);//拿到的所有内容
String openid = ("openid").toString();
System.out.println(openid);//拿到的openid
j.setSuccess(true);
j.put("openid", openid);
return j;
}
@ResponseBody
@RequestMapping(value = "orderResult")
public AjaxJson orderResult(Miniprogram miniprogram) throws IOException{
AjaxJson j = new AjaxJson();
//商户号
String mch_id = "";
//key为商户平台设置的密钥key
String WXKeHukey = "";
String appId = APPID;
String notify_url = "www.hnskxxjsyxgs/zzys/a/miniprogram/miniprogram/xcxNotify";//回调地址
String trade_type = "JSAPI";
//签名类型
String SIGNTYPE = "MD5";
//第⼀次发起⽀付请求的接⼝地址
String pay_url = "h.weixin.qq/pay/unifiedorder";
//⽣成的随机字符串
String nonce_str = getRandomString(32);
//本机的ip地址
String spbill_create_ip = "";
//商户订单号(先⽤时间代替),可以⾃⼰定义订单号格式
Date date = new Date();
String randomString = RandomString(5);
String orderNo = "R"+Time();
Map<String, String> packageParams = new HashMap<String, String>();
//⼩程序ID,分配的⼩程序ID
packageParams.put("appid", appId);
//商户号,⽀付分配的商户号
packageParams.put("mch_id", mch_id);
//随机字符串,长度要求在32位以内。
packageParams.put("nonce_str", nonce_str);
//商品简单描述
packageParams.put("body", "⽤户充值");
//商户系统内部订单号,要求32个字符内,只能是数字、⼤⼩写字母_-|*且在同⼀个商户号下唯⼀
packageParams.put("out_trade_no", orderNo);//商户订单号
String money = Money().toString();
String changeBranch = changeBranch(money);
//订单总⾦额,单位为分
packageParams.put("total_fee", changeBranch);
//终端IP,⽀持IPV4和IPV6两种格式的IP地址。调⽤⽀付API的机器IP
packageParams.put("spbill_create_ip", spbill_create_ip);
/
/异步接收⽀付结果通知的回调地址,通知url必须为外⽹可访问的url,不能携带参数。
packageParams.put("notify_url", notify_url);
//交易类型(JSAPI--JSAPI⽀付(或⼩程序⽀付)、NATIVE--Native⽀付、APP--app⽀付,MWEB--H5⽀付,不同trade_type决定了调起⽀付的⽅式,请根据⽀付产品 packageParams.put("trade_type", trade_type);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论