调用支付jsapi缺少参数appid_服务商模式下的小程序微信支付
最近,要做一個小程序商城的項目,需要在小程序中用到分賬功能,也就是顧客購買商品支付的錢要給各個店鋪,這就需要用到服務(wù)商模式。
在談服務(wù)商模式下小程序微信支付之前,我們先要有一個服務(wù)商的商戶號,這個商戶號哪里來呢,首先你的有一個認(rèn)證過的服務(wù)號,然后在服務(wù)號中找到微信支付--申請服務(wù)商
然后申請之后就會得到一個服務(wù)商的商戶號,在商戶號中:服務(wù)商功能---特約商戶申請---新增商戶,按照提示申請一個特約商戶號,注意:服務(wù)商模式不支持綁定已有的商戶號作為特約商戶,只能在服務(wù)商商戶號中申請新增,填完信息之后等微信審核通過之后,會顯示入駐成功。
做個比喻,服務(wù)商商戶號就相當(dāng)于總店,特約商戶相當(dāng)于分店,但是總店不能作為分店使用,顧客支付的錢是打到特約商戶號中的。
然后,我們需要申請一個小程序,并開通微信支付功能,這里就不詳細(xì)說明了
緊接著,我們到服務(wù)商商戶號中:服務(wù)商功能--特約商戶管理--配置--特約商戶APPID配置,添加新申請的小程序的appid
這些都準(zhǔn)備好之后,就開始代碼階段了
首先通過微信開發(fā)者工具建一個小程序的項目
項目名稱自定義,目錄是新建的一個空文件夾,appid是小程序的appid,點擊新建就出現(xiàn)一個小程序的demo,詳細(xì)的就不解釋了
首先需要獲取到小程序的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();
// 調(diào)用統(tǒng)一下單接口必需傳的參數(shù),可以查看微信支付統(tǒng)一下單接口api查看每個參數(shù)的意思
nvps.add(new NameValuePair("appid","")); //服務(wù)商對應(yīng)的服務(wù)號的appid 不是小程序的
nvps.add(new NameValuePair("body", "水杯")); //商品描述
nvps.add(new NameValuePair("mch_id","")); //服務(wù)商的商戶號
nvps.add(new NameValuePair("nonce_str","ibuaiVcKdpRxkhJA"));
nvps.add(new NameValuePair("notify_url","")); //回調(diào)地址需要根據(jù)實際項目做修改
nvps.add(new NameValuePair("out_trade_no",CommonUtil.getUID()));
nvps.add(new NameValuePair("profit_sharing","Y")); //是否進(jìn)行分賬 比較重要
nvps.add(new NameValuePair("spbill_create_ip", "127.0.0.1"));//ip地址需要根據(jù)實際項目做修改
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(); // 根據(jù)簽名格式組裝數(shù)據(jù),詳見微信支付api
String stringSignTemp = signA + "key=asjdjaskdjaksdjaskjd"; // 服務(wù)商的密鑰
//System.out.println("第一次輸出xml"+stringSignTemp);
String sign = DigestUtils.md5Hex(getContentBytes(stringSignTemp, "UTF-8")).toUpperCase(); // 把組裝好的簽名數(shù)據(jù)md5之后字母都轉(zhuǎn)換為大寫,詳見微信支付api
nvps.add(new NameValuePair("sign", sign)); // 把簽名后的數(shù)據(jù)組裝成參數(shù)
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("請求返回的結(jié)果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(); // 根據(jù)簽名格式組裝數(shù)據(jù),詳見微信支付api
String stringSignTemp1 = signB + "key=ajfaslkjdkas"; // 服務(wù)商的密鑰
//System.out.println("第二次輸出xml "+stringSignTemp1);
String sign1 = DigestUtils.md5Hex(
getContentBytes(stringSignTemp1, "UTF-8")).toUpperCase(); // 把組裝好的簽名數(shù)據(jù)md5之后字母都轉(zhuǎn)換為大寫,詳見微信支付api
jso.put("paySign", sign1);
return R.ok().put("data", jso);
}
```
```
// 轉(zhuǎn)換成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數(shù)據(jù)=" + sb.toString());
return sb.toString();
}
```
完成以上步驟就可以完成服務(wù)商模式下小程序的微信支付了,下一章講一下分賬。如果有什么問題可以評論,我會及時回答大家的。剛開始寫文章,還是很生疏的,望大家諒解,謝謝。
總結(jié)
以上是生活随笔為你收集整理的调用支付jsapi缺少参数appid_服务商模式下的小程序微信支付的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android安装python open
- 下一篇: php编写一个学生类_Python零基础