记录服务商模式下的小程序微信支付

最近,要做一个小程序商城的项目,需要在小程序中用到分账功能,也就是顾客购买商品支付的钱要给各个店铺,这就需要用到服务商模式。
在谈服务商模式下小程序微信支付之前,我们先要有一个服务商的商户号,这个商户号哪里来呢,首先你的有一个认证过的服务号,然后在服务号中找到微信支付–申请服务商

在这里插入图片描述
然后申请之后就会得到一个服务商的商户号,在商户号中:服务商功能—特约商户申请—新增商户,按照提示申请一个特约商户号,注意:服务商模式不支持绑定已有的商户号作为特约商户,只能在服务商商户号中申请新增,填完信息之后等微信审核通过之后,会显示入驻成功。
在这里插入图片描述
做个比喻,服务商商户号就相当于总店,特约商户相当于分店,但是总店不能作为分店使用,顾客支付的钱是打到特约商户号中的。

然后,我们需要申请一个小程序,并开通微信支付功能,这里就不详细说明了

在这里插入图片描述

紧接着,我们到服务商商户号中:服务商功能–特约商户管理–配置–特约商户APPID配置,添加新申请的小程序的appid

在这里插入图片描述

这些都准备好之后,就开始代码阶段了
首先通过微信开发者工具建一个小程序的项目

项目名称自定义,目录是新建的一个空文件夹,appid是小程序的appid,点击新建就出现一个小程序的demo,详细的就不解释了

首先需要获取到小程序的openid,这里就多说了,如果有朋友不会的话,自行百度一下吧,咱们主要是讲支付这一块。
页面创建按钮

如下是小程序代码中点击立即支付按钮的js代码:

pay: function () {
    wx.showLoading({
      title: '加载中',
    })
    var that = this;
    this.req('/interfaceController/pay', {
      openId:this.data.openid
    }, function (res) {
      console.log(111111111111111111, res)
      var timeStamp = res.data.data.timeStamp;
      var nonceStr = res.data.data.nonceStr;
      var pac = res.data.data.package;
      var paySign = res.data.data.paySign;
      wx.requestPayment({
        timeStamp: timeStamp,
        nonceStr: nonceStr,
        package: pac,
        signType: 'MD5',
        paySign: paySign,
        success(res) {

         },
        fail(res) { 
          console.log(res)
        }
      })
    });
  }

如下是后台代码:

/**
	 * 小程序微信支付接口
	 * @throws UnsupportedEncodingException 
	 */
	@RequestMapping("/pay")
	public R ticketList(String openId) throws UnsupportedEncodingException{
		
		List<NameValuePair> nvps = new ArrayList<NameValuePair>();
		// 调用统一下单接口必需传的参数,可以查看微信支付统一下单接口api查看每个参数的意思
		nvps.add(new NameValuePair("appid","")); //服务商对应的服务号的appid 不是小程序的
		nvps.add(new NameValuePair("body", "水杯"));        //商品描述	
		nvps.add(new NameValuePair("mch_id",""));  //服务商的商户号
		nvps.add(new NameValuePair("nonce_str","ibuaiVcKdpRxkhJA"));
		nvps.add(new NameValuePair("notify_url","")); //回调地址需要根据实际项目做修改  
		nvps.add(new NameValuePair("out_trade_no",CommonUtil.getUID()));
		nvps.add(new NameValuePair("profit_sharing","Y")); //是否进行分账  比较重要
		nvps.add(new NameValuePair("spbill_create_ip", "127.0.0.1"));//ip地址需要根据实际项目做修改
		nvps.add(new NameValuePair("sub_appid", "")); //小程序的appid
		nvps.add(new NameValuePair("sub_mch_id","")); //特约商户的商户号
		nvps.add(new NameValuePair("sub_openid",openId)); //小程序的openid
		nvps.add(new NameValuePair("total_fee", "100"));
		nvps.add(new NameValuePair("trade_type", "JSAPI"));
	
		StringBuffer sb = new StringBuffer();

		for (NameValuePair nvp : nvps) {
			sb.append(nvp.getName() + "=" + nvp.getValue() + "&");
		}
		String signA = sb.toString(); // 根据签名格式组装数据,详见微信支付api
		String stringSignTemp = signA + "key=asjdjaskdjaksdjaskjd"; //  服务商的密钥
		//System.out.println("第一次输出xml"+stringSignTemp);
		String sign = DigestUtils.md5Hex(getContentBytes(stringSignTemp, "UTF-8")).toUpperCase(); // 把组装好的签名数据md5之后字母都转换为大写,详见微信支付api
		nvps.add(new NameValuePair("sign", sign)); // 把签名后的数据组装成参数
		TenpayHttpClient httpClient = new TenpayHttpClient();
		httpClient.setReqContent(url);
		String resContent = "";
		String prepay_id = "";
		if (httpClient.callHttpPost(url, toXml(nvps))) {
			resContent = httpClient.getResContent();
			String result = new String(resContent.getBytes("UTF-8"), "UTF-8");
			//System.out.println("请求返回的结果1=" + result);
			JSONObject xmlJSONObj = XML.toJSONObject(result);
			//System.out.println(xmlJSONObj.toString());
			 JSONArray childNodes = JSONML.toJSONObject(result.toString()).getJSONArray("childNodes");  
             int len = childNodes.length() - 1;  
             for (int i = len; i > -1; i--) {  
                 JSONObject js = childNodes.getJSONObject(i);  
                 System.out.println(js.toString());
                 if (js.get("tagName").equals("prepay_id")) {  
                     prepay_id = js.getJSONArray("childNodes").getString(0);  
                     System.out.println("prepay_id:"+prepay_id);
                     break;  
                 }  
             }  
		}
		Map<String, String> jso = new HashMap<String, String>();
         jso.put("nonceStr", "ibuaiVcKdpRxkhJA");  
         jso.put("package", "prepay_id=" + prepay_id);  
         jso.put("signType", "MD5");  
         jso.put("timeStamp", "1395712654"); 
         List<NameValuePair> nvps1 = new ArrayList<NameValuePair>();
         nvps1.add(new NameValuePair("appId", ""));//小程序的appid
 		 nvps1.add(new NameValuePair("nonceStr", "ibuaiVcKdpRxkhJA"));
 		 nvps1.add(new NameValuePair("package", "prepay_id=" + prepay_id));
 		 nvps1.add(new NameValuePair("signType", "MD5"));
 		 nvps1.add(new NameValuePair("timeStamp","1395712654"));
 		StringBuffer sb1 = new StringBuffer();

		for (NameValuePair nvp : nvps1) {
			sb1.append(nvp.getName() + "=" + nvp.getValue() + "&");
		}
		String signB = sb1.toString(); // 根据签名格式组装数据,详见微信支付api
		String stringSignTemp1 = signB + "key=ajfaslkjdkas"; // 服务商的密钥
		//System.out.println("第二次输出xml "+stringSignTemp1);
		String sign1 = DigestUtils.md5Hex(
				getContentBytes(stringSignTemp1, "UTF-8")).toUpperCase(); // 把组装好的签名数据md5之后字母都转换为大写,详见微信支付api
         
         jso.put("paySign", sign1); 
		return R.ok().put("data", jso);
	}
// 转换成xml格式
		private String toXml(List<NameValuePair> params) {
			StringBuilder sb = new StringBuilder();
			sb.append("<xml>");
			for (int i = 0; i < params.size(); i++) {
				sb.append("<" + params.get(i).getName() + ">");
				sb.append((params.get(i)).getValue());
				sb.append("</" + params.get(i).getName() + ">");
			}
			sb.append("</xml>");
			//System.out.println("xml数据=" + sb.toString());
			return sb.toString();
		}

完成以上步骤就可以完成服务商模式下小程序的微信支付了,下一章讲一下分账。如果有什么问题可以评论,我会及时回答大家的。刚开始写文章,还是很生疏的,望大家谅解,谢谢。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值