大家好,我是小悟
在抖音小程序刚出来的时候就对接过在抖音小程序里面的支付,想一下,那都是三年前的事情了。
经过这么长的时间,抖音小程序也越来越完善了,不仅体现在本身的功能上,就连开放平台也焕然一新。在体验上,不管是对开发者或者用户,都是更上一层楼的。
抽空又研究了下抖音小程序的收银台,可以支持多种渠道支付,包括抖音支付、支付宝支付、微信支付。
1、开通支付
先在小程序后台,能力-支付那边开通支付能力,开通也很简单,按要求上传资料,可以同时开通抖音、支付宝和微信支付。
审核通过后,抖音和支付宝支付是立即开通的,但是微信支付还需要微信支付管理员扫码签约,签约后会显示审核中,审核通过后会显示已开通。
2、后端接入
在开发文档处找到担保支付,后端需要接入预下单接口,发往小程序服务端的请求,在没有特殊说明时,均需要使用担保支付密钥进行签名,用于保证请求的来源。
public static String Map2String(Map<String, Object> paramsMap) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("map[");
List<String> params = new ArrayList<>();
List<String> paramsArr = new ArrayList<>();
for (String key : paramsMap.keySet()) {
paramsArr.add(key);
}
Collections.sort(paramsArr);
for (String key : paramsArr) {
Object objValue = paramsMap.get(key);
if (objValue instanceof Map) {
params.add(key + ":" + Map2String((Map) objValue));
} else if (objValue instanceof List) {
params.add(key + ":" + List2String((List) objValue));
} else {
params.add(key + ":" + objValue.toString());
}
}
stringBuilder.append(String.join(" ", params));
stringBuilder.append("]");
return stringBuilder.toString();
}
public static String List2String(List<Object> list) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("[");
List<String> paramsArr = new ArrayList<>();
for (Object item : list) {
if (item instanceof List) {
paramsArr.add(List2String((List) item));
} else if (item instanceof Map) {
paramsArr.add(Map2String((Map) item));
} else {
paramsArr.add(item.toString());
}
}
stringBuilder.append(String.join(" ", paramsArr));
stringBuilder.append("]");
return stringBuilder.toString();
}
public final static List<String> REQUEST_NOT_NEED_SIGN_PARAMS = Arrays.asList("app_id", "thirdparty_id", "sign", "other_settle_params");
public static String requestSign(Map<String, Object> paramsMap) {
List<String> paramsArr = new ArrayList<>();
for (Map.Entry<String, Object> entry : paramsMap.entrySet()) {
String key = entry.getKey();
if (REQUEST_NOT_NEED_SIGN_PARAMS.contains(key)) {
continue;
}
Object objValue = entry.getValue();
String value = "";
if (objValue instanceof Map) {
value = Map2String((Map) objValue);
} else if (objValue instanceof List) {
value = List2String((List) objValue);
} else {
value = entry.getValue().toString();
}
value = value.trim();
if (value.startsWith("\"") && value.endsWith("\"") && value.length() > 1) {
value = value.substring(1, value.length() - 1);
}
value = value.trim();
if (value.equals("") || value.equals("null")) {
continue;
}
paramsArr.add(value);
}
paramsArr.add(SALT);
Collections.sort(paramsArr);
StringBuilder signStr = new StringBuilder();
String sep = "";
for (String s : paramsArr) {
signStr.append(sep).append(s);
sep = "&";
}
return md5FromStr(signStr.toString());
}
private static String md5FromStr(String inStr) {
MessageDigest md5;
try {
md5 = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return "";
}
byte[] byteArray = inStr.getBytes(StandardCharsets.UTF_8);
byte[] md5Bytes = md5.digest(byteArray);
StringBuilder hexValue = new StringBuilder();
for (byte md5Byte : md5Bytes) {
int val = ((int) md5Byte) & 0xff;
if (val < 16) {
hexValue.append("0");
}
hexValue.append(Integer.toHexString(val));
}
return hexValue.toString();
}
然后发起预下单请求,返回如下信息即调用成功,order_id和order_token需要传给小程序端,唤起收银台。
{
"err_no": 0,
"err_tips": "success",
"data": {
"order_id": "N7274614689692403869",
"order_token": "GVVxECgwIARDGJRiuMiABK4uiCoAESTgpMn+ejoVk1fqzVSL4HFO6myCMTzR1WyueGMGJV/iugWtIXFshTgpx5IQSRPxApgtm2VaQwSJPOsW0g1wUccxLoAqOgeYBmlu.E",
"url": ""
}
}
3、小程序端接入
接收到后端生成的预下单信息后,再调用小程序api,就可以唤起收银台。
唤起收银台的小程序appid需要和请求预下单接口传参的appid一致,否则会拉起收银台失败。
tt.pay({
orderInfo: {
order_id: 'N7274614689692403869',
order_token: 'GVVxECgwIARDGJRiuMiABK4uiCoAESTgpMn+ejoVk1fqzVSL4HFO6myCMTzR1WyueGMGJV/iugWtIXFshTgpx5IQSRPxApgtm2VaQwSJPOsW0g1wUccxLoAqOgeYBmlu.E',
},
service: 5,
success(res) {
if (res.code == 0) {
// 支付成功处理逻辑,只有res.code=0时,才表示支付成功
// 但是最终状态要以商户后端结果为准
}
},
fail(res) {
// 调起收银台失败处理逻辑
},
});
支付能力即功能关闭后,小程序将关闭支付能力,新增订单支付将被拦截。该能力不影响历史订单的退款、分账与账户提现。
支付方式即关闭支付方式后,小程序收银台将不展示对应的支付方式,用户无法使用该支付方式进行支付。
您的一键三连,是我更新的最大动力,谢谢
山水有相逢,来日皆可期,谢谢阅读,我们再会
我手中的金箍棒,上能通天,下能探海