最近,要做一个小程序商城的项目,需要在小程序中用到分账功能,也就是顾客购买商品支付的钱要给各个店铺,这就需要用到服务商模式。
在谈服务商模式下小程序微信支付之前,我们先要有一个服务商的商户号,这个商户号哪里来呢,首先你的有一个认证过的服务号,然后在服务号中找到微信支付--申请服务商
![853f35f233039beb12242e540560a39f.png](https://i-blog.csdnimg.cn/blog_migrate/abf309a07247bb7c95b67a616f89b029.jpeg)
然后申请之后就会得到一个服务商的商户号,在商户号中:服务商功能---特约商户申请---新增商户,按照提示申请一个特约商户号,注意:服务商模式不支持绑定已有的商户号作为特约商户,只能在服务商商户号中申请新增,填完信息之后等微信审核通过之后,会显示入驻成功。
![d4a0d11a37629839a3938c2d8547d0f5.png](https://i-blog.csdnimg.cn/blog_migrate/cf18c3881a79b24ae9d5c79c685d9d5b.jpeg)
做个比喻,服务商商户号就相当于总店,特约商户相当于分店,但是总店不能作为分店使用,顾客支付的钱是打到特约商户号中的。
然后,我们需要申请一个小程序,并开通微信支付功能,这里就不详细说明了
![84fdbb411b43b32ce69b6c256cbeabed.png](https://i-blog.csdnimg.cn/blog_migrate/3f7afb0c29a7b2ff4dd805b7b34f0882.jpeg)
紧接着,我们到服务商商户号中:服务商功能--特约商户管理--配置--特约商户APPID配置,添加新申请的小程序的appid
![7c8e633fb29601e72a6f96548fb3ec55.png](https://i-blog.csdnimg.cn/blog_migrate/11df9830e7c88bc384146273ba808468.jpeg)
这些都准备好之后,就开始代码阶段了
首先通过微信开发者工具建一个小程序的项目
项目名称自定义,目录是新建的一个空文件夹,appid是小程序的appid,点击新建就出现一个小程序的demo,详细的就不解释了
首先需要获取到小程序的openid,这里就多说了,如果有朋友不会的话,自行百度一下吧,咱们主要是讲支付这一块。
![d2d4dfa33d51d3f6c656216575b6ebaa.png](https://i-blog.csdnimg.cn/blog_migrate/ed742634064d4542ce887ac6254bd830.jpeg)
如下是小程序代码中点击立即支付按钮的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 nvps = new ArrayList();
// 调用统一下单接口必需传的参数,可以查看微信支付统一下单接口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 jso = new HashMap();
jso.put("nonceStr", "ibuaiVcKdpRxkhJA");
jso.put("package", "prepay_id=" + prepay_id);
jso.put("signType", "MD5");
jso.put("timeStamp", "1395712654");
List nvps1 = new ArrayList();
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 params) {
StringBuilder sb = new StringBuilder();
sb.append("");
for (int i = 0; i < params.size(); i++) {
sb.append("");
sb.append((params.get(i)).getValue());
sb.append("" + params.get(i).getName() + ">");
}
sb.append("");
//System.out.println("xml数据=" + sb.toString());
return sb.toString();
}
```
完成以上步骤就可以完成服务商模式下小程序的微信支付了,下一章讲一下分账。如果有什么问题可以评论,我会及时回答大家的。刚开始写文章,还是很生疏的,望大家谅解,谢谢。