调用支付jsapi缺少参数appid_服务商模式下的小程序微信支付

最近,要做一个小程序商城的项目,需要在小程序中用到分账功能,也就是顾客购买商品支付的钱要给各个店铺,这就需要用到服务商模式。

在谈服务商模式下小程序微信支付之前,我们先要有一个服务商的商户号,这个商户号哪里来呢,首先你的有一个认证过的服务号,然后在服务号中找到微信支付--申请服务商

853f35f233039beb12242e540560a39f.png

然后申请之后就会得到一个服务商的商户号,在商户号中:服务商功能---特约商户申请---新增商户,按照提示申请一个特约商户号,注意:服务商模式不支持绑定已有的商户号作为特约商户,只能在服务商商户号中申请新增,填完信息之后等微信审核通过之后,会显示入驻成功。

d4a0d11a37629839a3938c2d8547d0f5.png

做个比喻,服务商商户号就相当于总店,特约商户相当于分店,但是总店不能作为分店使用,顾客支付的钱是打到特约商户号中的。

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

84fdbb411b43b32ce69b6c256cbeabed.png

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

7c8e633fb29601e72a6f96548fb3ec55.png

这些都准备好之后,就开始代码阶段了

首先通过微信开发者工具建一个小程序的项目

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

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

d2d4dfa33d51d3f6c656216575b6ebaa.png

如下是小程序代码中点击立即支付按钮的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();

}

```

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值