调用支付jsapi缺少参数appid_服务商模式下的小程序微信支付
最近,要做一个小程序商城的项目,需要在小程序中用到分账功能,也就是顾客购买商品支付的钱要给各个店铺,这就需要用到服务商模式。
在谈服务商模式下小程序微信支付之前,我们先要有一个服务商的商户号,这个商户号哪里来呢,首先你的有一个认证过的服务号,然后在服务号中找到微信支付--申请服务商
然后申请之后就会得到一个服务商的商户号,在商户号中:服务商功能---特约商户申请---新增商户,按照提示申请一个特约商户号,注意:服务商模式不支持绑定已有的商户号作为特约商户,只能在服务商商户号中申请新增,填完信息之后等微信审核通过之后,会显示入驻成功。
做个比喻,服务商商户号就相当于总店,特约商户相当于分店,但是总店不能作为分店使用,顾客支付的钱是打到特约商户号中的。
然后,我们需要申请一个小程序,并开通微信支付功能,这里就不详细说明了
紧接着,我们到服务商商户号中:服务商功能--特约商户管理--配置--特约商户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_服务商模式下的小程序微信支付相关推荐
- 调用支付jsapi缺少参数:total_fee_小程序支付问题怎么解决?
微信小程序开发的过程一定会遇到各种问题,最让人棘手的就是支付问题,因为没有支付做商城类似的小程序就没有办法完成最关键的一步.那么支付失败到底什么原因呢?一下子收集了几个错误类似,希望对你有帮助: No ...
- 微信支付接口,提示:调用支付jsapi缺少参数: $key0$
下面是 官方给的 帮助文档. 支付返回签名错误 注意签名参数的大小写,支付密钥key要到商户平台设置,设置的规则是32位数字与字母大小写的组合.以下链接为签名过程. (https://pay.weix ...
- uniapp小程序微信支付功能
目录 字段说明 前置工作 获取openid 微信支付 报错问题 uniapp 开发小程序需要实现微信支付功能,下面对相关业务进行说明. 字段说明 AppID:小程序的身份证,微信客户端用来确认你的小程 ...
- 微信小程序支付返回签名错误_java 微信小程序微信支付统一下订单及数字签名错误问题(后端)...
今天来分享一下之前做微信小程序微信支付遇到的一些坑,博主这里是微信小程序支付功能,因此选择的微信支付方式是JSAPI支付方式(温馨提示左下角有音乐哦). 首先我们肯定是要在小程序后台绑定一个商户号的, ...
- tp小程序微信支付部分代码
小程序微信支付开发指引:https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_8_2.shtml 流程图: <?php names ...
- 小程序微信支付开发流程记录
我所在公司需要开发一款商城小程序,里面需要用到微信支付,我负责里面的下单功能,从小程序端到后台的支付流程都是我自己开发的,由于我们组没有人有开发微信支付的经验,只有我有开发过JSAPI的微信支付的经验 ...
- nodejs实现小程序微信支付
最近做小程序时用到了微信支付很是开心,因为之前支付一直都没有做过,终于又可以学点东西了.于是很开心的去看了下微信小程序的支付接口,没想到,事情基本都是后端做的,前端只要调用wx.requestPaym ...
- PHP实现小程序微信支付V2获取prepay_id
PS:本文旨在简单获取prepay_id,只是简单的介绍一下流程,并非完整的订单支付流程 小程序端JS代码: getxml(){var test = thiswx.getStorage({ //从缓存 ...
- 微信小程序 微信支付代码实现流程
微信小程序 微信支付是一个很简单的流程 微信开发文档 地址:wx.requestPayment(Object object) | 微信开放文档 微信公众平台申请支付功能 百度一大堆例举代码 官方文档 ...
最新文章
- 2020牛客多校第三场[C Operation Love+基础计算几何 判断多边形顺逆时针]
- javaScript不是java脚本
- delete不调用析构函数的两种情况
- 将分享按钮加入到页面中
- oracle utl inaddr,oracle11g之ACL拙见
- 对象交互。英雄搏击游戏。0107
- RFID开发利器 proxmark3
- 华为P30 Lite参数曝光 配6.15寸水滴屏
- 浅谈API测试与UI Auomation一点心得
- 通过 poi 导入 Excel代码
- ios 相册 同时选择多张图片
- 计算机声卡和显卡驱动,声卡或显卡驱动怎么卸载干净?声卡或显卡常见驱动问题解决方案...
- (01)ORB-SLAM2源码无死角解析-(18) SVD奇异值分解→求解Homography,Fundamental矩阵,了解矩阵自由度
- 个人对于IT开发型技能段位的划分,我只是一个小小铂金,你什么段位了!
- JME 3 入门教程 3 - Hello Assets
- matlab双纵轴刻度覆盖问题,求助: matlab双纵轴换图问题
- 二狗子的志愿者故事20210121
- cubuide RS485问题排查
- 中秋节祝福html,中秋节祝福页面 在线制作祝福网页 祝你中秋节快乐!
- java.lang.IllegalArgumentException: not found @HttpResponse from class java.lang.Object解决方法
热门文章
- linux服务器无网络确认,Linux服务器故障排查实用指南
- (Buuctf) [第五空间2019 决赛]PWN5 简单格式化字符串漏洞利用
- mysql中00933错误_ORA-00933: SQL command not properly ended
- Python教程:列表推导式和嵌套的列表推导式讲解
- python的列表元素输出
- Python笔记:日期时间获取与转换
- c语言p,用C语言实现P、V操作
- C语言sscanf()函数(从字符串读取格式化输入,提取需要的信息)
- 【黑马程序员 C++教程从0到1入门编程】【笔记1】数据类型、运算符、程序流程结构、数组、函数、指针、结构体
- Intel Realsense D435 如何通过摄像头序列号获取指定摄像头的帧集对?