微信小程序支付、微信企业付款、微信公众号模板消息 实现,独立分装,简单实用
哈喽,我是梦辛工作室的灵,最近重新整理了下微信小程序支付、微信企业付款、微信公众号模板消息 实现的代码,由于之前的 代码比较 乱,且重复利用率不高,于是乎,我重新封装了下,可以很简单的使用了,下面讲一下 使用流程
1.微信小程序支付
要实现小程序支付,您得先准备好 已认证的小程序账号 和 微信商户号,并保证 微信商户号 与 小程序 账号之间已绑定,先讲下绑定流程吧
先登录 微信支付平台(网址:https://pay.weixin.qq.com/index.php/core/home/login?return_url=%2Findex.php%2Fcore%2Fhome),
1.1数据准备
点击产品中心,选择APPID授权管理
点击关联更多APPID:
输入小程序的APPID,点击下一步
然后登陆小程序账号,点击左侧的微信支付
这里会有个待确认的数据,点击确认后,绑定就算是 完成了
接下来就是在商户号里获取API_KEY 我们等下开发的时候回用到
点击账户中心,点击API安全
然后设置好您的API秘钥并记录下来(重要)
1.2 获取Openid
第二步就是 去获取openid
获取openid的操作比较 简单,大致流程就是 在小程序内调用wx.login方法获取到 code,在用code 加上小程序appid 和 小程序 appsecret 去访问微信提供的地址就获取到了openid,每个用户对于 每个小程序都有不同的openid
下面是示例代码:
先小程序端,主要是在小程序端获取code,然后在后端获取换取openid:
wx.login({
success: res => {
console.log(res);
var openid = wx.getStorageSync('openid');
if(openid == ""){
var obj_codedata = {
code: res.code,
appid: '',
appsecret : ''
};
util.requestGetPay("/getopenid", obj_codedata, function (res) {
console.log(res)
if (("SUCCESS" == res.data.return_code)) {
wx.setStorageSync('openid', res.data.openid);
wx.setStorageSync('session_key', res.data.session_key);
that.globalData.openid = res.data.openid;
}
});
}else{
that.globalData.openid = openid;
}
}
然后服务端的代码,主要是想小程序获取的code和appid和appsecret作为参数访问微信提供的接口即可:
result = WxPayUtil.sendHttpsRequest("https://api.weixin.qq.com/sns/oauth2/access_token?grant_type=authorization_code&appid="+ code +"&secret=" +secret + "&code=" +code,
"", "text/xml", "utf-8", "GET");
jsonObject = JSONObject.fromObject(result);
然后将获取到的数据 返回即可,楼主这里为了以后方便使用,就直接做了一个简单的封装,这样使用就可以,代码放在最下方了:
/**
* 获取openid 调用示例
*/
public static void getOpenid() {
try {
GetOpenidBuilder getOpenidBuilder = new GetOpenidBuilder();
getOpenidBuilder.setAppid("您的小程序Openid");
getOpenidBuilder.setAppsecret("您的小程序秘钥");
getOpenidBuilder.setCode("小程序登陆时获取的code");
getOpenidBuilder.build();// 验证数据
System.out.println(getOpenidBuilder.hand());// 发送处理
} catch (LackParamExceptions e) {
e.printStackTrace();
}
}
拿到openid就可以开始调用微信的预下订单接口:
需要提供一下参数:
第三个参数为true就是必要参数,false就是不必要参数
然后需要按照字母顺序排好拼接成一个字符串,类似于这样格式的:
appid=小程序APPID&attach=携带参数&body=商品内容&mch_id=商户号&nonce_str=m6aWk5UiMLNrGW7o45Xa¬ify_url=回调地址&openid=OPENID&out_trade_no=1577087046273FQEqXLi7&sign_type=MD5&spbill_create_ip=发起请求的IP&time_expire=20191223161406&time_start=20191223154406&total_fee=50&trade_type=JSAPI
然后再在末尾拼接一个key=上面在商户号里获取到的APIKey
appid=小程序APPID&attach=携带参数&body=商品内容&mch_id=商户号&nonce_str=m6aWk5UiMLNrGW7o45Xa¬ify_url=回调地址&openid=OPENID&out_trade_no=1577087046273FQEqXLi7&sign_type=MD5&spbill_create_ip=发起请求的IP&time_expire=20191223161406&time_start=20191223154406&total_fee=50&trade_type=JSAPI&key=您商户号的APIKey
然后再对上面的字符串进行md5加密,或者其他加密也可以,不过sign_type要修改为您的加密方式;
加密后拿到的就是sign,最后拼接成xml,如以下格式:
<xml>
<appid><![CDATA[小程序APPID]]></appid>
<attach><![CDATA[自定义参数]]></attach>
<body><![CDATA[商品内容]]></body>
<mch_id><![CDATA[商户号]]></mch_id>
<nonce_str><![CDATA[随机字符串]]></nonce_str>
<notify_url><![CDATA[回调地址]]></notify_url>
<openid><![CDATA[用户的OPenid]]></openid>
<out_trade_no><![CDATA[自定义订单号]]></out_trade_no>
<sign_type><![CDATA[MD5]]></sign_type>
<spbill_create_ip><![CDATA[发起请求的IP]]></spbill_create_ip>
<time_expire><![CDATA[订单有效截止时间,示例:20191223160738]]></time_expire>
<time_start><![CDATA[订单开始时间,示例:20191223153738]]></time_start>
<total_fee><![CDATA[交易金额,单位 分]]></total_fee>
<trade_type><![CDATA[JSAPI]]></trade_type>
<sign><![CDATA[fbec923a8a7a4c15a2c64d9c526e160c]]></sign>
</xml>
然后将该xml内容post 发送到微信的指定接口(https://api.mch.weixin.qq.com/pay/unifiedorder,备用接口:https://api2.mch.weixin.qq.com/pay/unifiedorder);
访问成功时,微信会返回 nonce_str(随机字符串),prepay_id(“预下订单号”),然后我们需要向之前获取sign一样,先按字母拼接成字符串
&appId=您的小程序appid&nonceStr=字符串&package=prepay_id=返回的预下订单号&signType=MD5&timeStamp=当前的时间戳&key=您的商户号APIKey
然后进行md5加密,获取到sign,然后在将 nonceStr,package,signType,timeStamp对应的数据返回给小程序端,由小程序调用微信支付的接口
wx.requestPayment({
timeStamp: res.data.timeStamp,
nonceStr: res.data.nonceStr,
"package": res.data.package,
signType: res.data.signType,
paySign: res.data.paySign,
success: function (res) {
}
});
付款成功后,微信这边会回调您设置的回调地址:
然后你接收到消息后需要回复微信这边处理结果,如果迟迟无法获取到结果,微信会每隔一段时间回调一次,
回复处理失败示例:
<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[FAIL]]></return_msg></xml>
回复处理成功示例:
<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>
其实整个过程还是挺复杂的,但是用流畅的也就简单了,但每次都这样做肯定就显的麻烦了些,所以楼主就重新将代码整理封装了下,挺实用的,分享给大家
下面写一下使用 方法:
/**
* 微信预下单 调用示例
*/
public static void JSAPIPay() {
try {
JSAPIWxPayBuilder jsapiWxPayBuilder = new JSAPIWxPayBuilder();
jsapiWxPayBuilder.setAppid("小程序APPID");
jsapiWxPayBuilder.setAttach("携带参数");
jsapiWxPayBuilder.setMch_id("商户号");
jsapiWxPayBuilder.setAPI_KEY("商户号API秘钥");
jsapiWxPayBuilder.setBody("商品内容");
jsapiWxPayBuilder.setTotal_fee(50); // 交易金额
jsapiWxPayBuilder.setNotify_url("回调地址"); //
jsapiWxPayBuilder.setSpbill_create_ip("发起请求的IP"); //
jsapiWxPayBuilder.setOpenid("OPENID");
jsapiWxPayBuilder.build();// 验证数据
System.out.println(jsapiWxPayBuilder.hand());// 发送处理
} catch (LackParamExceptions e) {
e.printStackTrace();
}
}
对,就是这样就完成了,不需要其他什么了,你只用将hand返回的数据返回给小程序端就可以了,记得一定要build,这里会帮您验证数据 是否正确,是否有缺少的必要数据,没有build成功,也不能调用hand的
里面还加的有 企业付款的示例,发送模板消息的封装,感觉贼好用,喜欢的朋友给个赞=-=
温馨提示:若出现返回为签名错误的提示,请检查下商户号、小程序APPID、APIKey是否一致,若一致依旧出现签名错误,建议重置下秘钥,有些秘钥微信不认
我放在github了,点击这里进入