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

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

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

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

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

紧接着,我们到服务商商户号中:服务商功能--特约商户管理--配置--特约商户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 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();

}

```

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

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

  1. 调用支付jsapi缺少参数:total_fee_小程序支付问题怎么解决?

    微信小程序开发的过程一定会遇到各种问题,最让人棘手的就是支付问题,因为没有支付做商城类似的小程序就没有办法完成最关键的一步.那么支付失败到底什么原因呢?一下子收集了几个错误类似,希望对你有帮助: No ...

  2. 微信支付接口,提示:调用支付jsapi缺少参数: $key0$

    下面是 官方给的 帮助文档. 支付返回签名错误 注意签名参数的大小写,支付密钥key要到商户平台设置,设置的规则是32位数字与字母大小写的组合.以下链接为签名过程. (https://pay.weix ...

  3. uniapp小程序微信支付功能

    目录 字段说明 前置工作 获取openid 微信支付 报错问题 uniapp 开发小程序需要实现微信支付功能,下面对相关业务进行说明. 字段说明 AppID:小程序的身份证,微信客户端用来确认你的小程 ...

  4. 微信小程序支付返回签名错误_java 微信小程序微信支付统一下订单及数字签名错误问题(后端)...

    今天来分享一下之前做微信小程序微信支付遇到的一些坑,博主这里是微信小程序支付功能,因此选择的微信支付方式是JSAPI支付方式(温馨提示左下角有音乐哦). 首先我们肯定是要在小程序后台绑定一个商户号的, ...

  5. tp小程序微信支付部分代码

    小程序微信支付开发指引:https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_8_2.shtml 流程图: <?php names ...

  6. 小程序微信支付开发流程记录

    我所在公司需要开发一款商城小程序,里面需要用到微信支付,我负责里面的下单功能,从小程序端到后台的支付流程都是我自己开发的,由于我们组没有人有开发微信支付的经验,只有我有开发过JSAPI的微信支付的经验 ...

  7. nodejs实现小程序微信支付

    最近做小程序时用到了微信支付很是开心,因为之前支付一直都没有做过,终于又可以学点东西了.于是很开心的去看了下微信小程序的支付接口,没想到,事情基本都是后端做的,前端只要调用wx.requestPaym ...

  8. PHP实现小程序微信支付V2获取prepay_id

    PS:本文旨在简单获取prepay_id,只是简单的介绍一下流程,并非完整的订单支付流程 小程序端JS代码: getxml(){var test = thiswx.getStorage({ //从缓存 ...

  9. 微信小程序 微信支付代码实现流程

    微信小程序 微信支付是一个很简单的流程  微信开发文档 地址:wx.requestPayment(Object object) | 微信开放文档 微信公众平台申请支付功能 百度一大堆例举代码 官方文档 ...

最新文章

  1. 2020牛客多校第三场[C Operation Love+基础计算几何 判断多边形顺逆时针]
  2. javaScript不是java脚本
  3. delete不调用析构函数的两种情况
  4. 将分享按钮加入到页面中
  5. oracle utl inaddr,oracle11g之ACL拙见
  6. 对象交互。英雄搏击游戏。0107
  7. RFID开发利器 proxmark3
  8. 华为P30 Lite参数曝光 配6.15寸水滴屏
  9. 浅谈API测试与UI Auomation一点心得
  10. 通过 poi 导入 Excel代码
  11. ios 相册 同时选择多张图片
  12. 计算机声卡和显卡驱动,声卡或显卡驱动怎么卸载干净?声卡或显卡常见驱动问题解决方案...
  13. (01)ORB-SLAM2源码无死角解析-(18) SVD奇异值分解→求解Homography,Fundamental矩阵,了解矩阵自由度
  14. 个人对于IT开发型技能段位的划分,我只是一个小小铂金,你什么段位了!
  15. JME 3 入门教程 3 - Hello Assets
  16. matlab双纵轴刻度覆盖问题,求助: matlab双纵轴换图问题
  17. 二狗子的志愿者故事20210121
  18. cubuide RS485问题排查
  19. 中秋节祝福html,中秋节祝福页面 在线制作祝福网页 祝你中秋节快乐!
  20. java.lang.IllegalArgumentException: not found @HttpResponse from class java.lang.Object解决方法

热门文章

  1. linux服务器无网络确认,Linux服务器故障排查实用指南
  2. (Buuctf) [第五空间2019 决赛]PWN5 简单格式化字符串漏洞利用
  3. mysql中00933错误_ORA-00933: SQL command not properly ended
  4. Python教程:列表推导式和嵌套的列表推导式讲解
  5. python的列表元素输出
  6. Python笔记:日期时间获取与转换
  7. c语言p,用C语言实现P、V操作
  8. C语言sscanf()函数(从字符串读取格式化输入,提取需要的信息)
  9. 【黑马程序员 C++教程从0到1入门编程】【笔记1】数据类型、运算符、程序流程结构、数组、函数、指针、结构体
  10. Intel Realsense D435 如何通过摄像头序列号获取指定摄像头的帧集对?