微信小程序支付详细流程,独立分装,简单实用

微信小程序支付、微信企业付款、微信公众号模板消息 实现,独立分装,简单实用

哈喽,我是梦辛工作室的灵,最近重新整理了下微信小程序支付、微信企业付款、微信公众号模板消息 实现的代码,由于之前的 代码比较 乱,且重复利用率不高,于是乎,我重新封装了下,可以很简单的使用了,下面讲一下 使用流程

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&notify_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&notify_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,如以下格式:

扫描二维码关注公众号,回复: 9824853 查看本文章
<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了,点击这里进入

发布了36 篇原创文章 · 获赞 13 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_41392105/article/details/103560326