微信小程序服务商模式填坑之路

微信小程序服务商模式填坑之路

看过此位前辈的帖子走出深坑,顺便补充几个易错点:https://blog.csdn.net/qq_18881987/article/details/94428628
本贴讨论的是后台统一下单和二次签名,至于小程序端的api就那么一个方法,后台参数传对基本上没有大问题
首先下载坑爹的微信官方sdk,导入到程序里是这个样子的:
在这里插入图片描述
接下来修改sdk里 wxpay类的验证方式,全部改成md5验证,坑爹的HMACSHA256一直报签名错误。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
接下来看微信官方文档
https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_sl_api.php?chapter=9_1
逐一讲解各个参数
data.put(“appid”, ServiceUtil.AppID); //服务商公众号的appid
data.put(“mch_id”, ServiceUtil.MchID); //服务商商户号(微信支付平台分配的)
data.put(“sub_mch_id”, ServiceUtil.sub_mch_id);//特约商户商户号(微信支付平台分配的)
data.put(“sub_appid”, ServiceUtil.sub_appid);//特约商户小程序的appid
data.put(“nonce_str”, nonce_str);//随机字符串
data.put(“body”, body); //填自己的类型 我这里写的订单支付
data.put(“out_trade_no”,serno); //自己的订单号
data.put(“total_fee”, price);//价格
data.put(“spbill_create_ip”, spbill_create_ip);//地址
data.put(“notify_url”, “127.0.0.1”);//回调地址
data.put(“trade_type”,“JSAPI”); //验证方式
data.put(“sub_openid”, openId); //这个参数我就呵呵了
data.put(“sign”, PayUtil.createSign(data,nonce_str)); 签名
data.put(“sign_type”, “MD5”); 签名验证方式

sub_openid

经过我2个小时的不断测试,这个参数就是。。openid。。。看了有些前辈的帖子说这个要在支付前重新通过wx。login方法获取。。我这边获取的结果是一样的。。不管了直接放到参数里,发现能过。。。
贴上我拿到这个参数的方法

package com.hsdsoft.wx;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;

import com.hdsoft.util.ServiceUtil;
import com.hdsoft.util.StringUtil;

public class WeChatGetOpenid {
	public static String interfaceUtil(String path,String data) {
    	String openId="";
        try {
            URL url = new URL(path);
            //打开和url之间的连接
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            PrintWriter out = null;
            //请求方式
//          conn.setRequestMethod("POST");
//           //设置通用的请求属性
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"); 
            //设置是否向httpUrlConnection输出,设置是否从httpUrlConnection读入,此外发送post请求必须设置这两个
            //最常用的Http请求无非是get和post,get请求可以获取静态页面,也可以把参数放在URL字串后面,传递给servlet,
            //post与get的 不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。
            conn.setDoOutput(true);
            conn.setDoInput(true);
            //获取URLConnection对象对应的输出流
            out = new PrintWriter(conn.getOutputStream());
            //发送请求参数即数据
            out.print(data);
            //缓冲数据
            out.flush();
            //获取URLConnection对象对应的输入流
            InputStream is = conn.getInputStream();
            //构造一个字符流缓存
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String str = "";
            while ((str = br.readLine()) != null) {
            	openId=str;
              
            }
            //关闭流
            is.close();
            //断开连接,最好写上,disconnect是在底层tcp socket链接空闲时才切断。如果正在被其他线程使用就不切断。
            //固定多线程的话,如果不disconnect,链接会增多,直到收发不出信息。写上disconnect后正常一些。
            conn.disconnect();
         
        } catch (Exception e) {
            e.printStackTrace();
        }
        return openId;
    }

	
	 public static String GetOpenID(String appid,String appsecret,String Code) {
	
	    	//临时登录凭证
	    	String URL = "https://api.weixin.qq.com/sns/jscode2session?appid="+appid+"&secret="+appsecret+"&js_code="+Code+"&grant_type=authorization_code";
	    	
	    	String openId=interfaceUtil(URL, "");
	    
	    	return openId;
	 }
	 public static String getSubOpenId() {
		 
		 return null;
	 }


}

在这里插入图片描述
看看官方文档里的解释我只想说去他大爷。
这里说一下。所有用到key的地方都是服务商微信支付平台里的key
如果你的签名算法和key没有问题,那么此刻统一下单就应该完成了。

这里需要主意的一点,特约商户的微信商户平台里(微信支付平台)必须要在appid授权里加上特约商户小程序的appid

服务商配置: 服务商功能➡️特约商户管理➡️开发配置➡️这里配置特约商户的公众号appid和小程序appid
在这里插入图片描述

统一下单结束后返回map集合给小程序

   Map<String, String> rMap = wxpay.unifiedOrder(data);
                System.out.println("统一下单接口返回: " + rMap);
                String return_code = (String) rMap.get("return_code");
                String result_code = (String) rMap.get("result_code");
                String nonceStr = WXPayUtil.generateNonceStr();
                resultMap.put("nonceStr", nonceStr);
                Long timeStamp = System.currentTimeMillis() / 1000;
                if ("SUCCESS".equals(return_code) && return_code.equals(result_code)) {
                    String prepayid = rMap.get("prepay_id");
                    System.out.println("prepayid=   "+prepayid);
                    resultMap.put("package", "prepay_id="+prepayid);
                    resultMap.put("signType", "MD5");
                    //这边要将返回的时间戳转化成字符串,不然小程序端调用wx.requestPayment方法会报签名错误
                    resultMap.put("timeStamp", timeStamp + "");
                    //再次签名,这个签名用于小程序端调用wx.requesetPayment方法
                    resultMap.put("appId",ServiceUtil.sub_appid);            
                    Map resultMap1=new HashMap();
                    resultMap1.put("appId",ServiceUtil.sub_appid);
                    resultMap1.put("timeStamp",timeStamp + "");
                    resultMap1.put("nonceStr",nonceStr);
                    resultMap1.put("package","prepay_id="+prepayid);
                    resultMap1.put("signType","MD5");
                    String sign = WXPayUtil.generateSignature(resultMap1,ServiceUtil.service_key);
                    resultMap.put("paySign", sign);
                    return resultMap;

注意这里给的appid是当前小程序的appid 也就是前面我在参数说明里写的sub_appid。
key是服务商的。。。别搞错了。。

填坑之路至此结束。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值