抖音小程序开发,唤起收银台,包括抖音支付、支付宝支付、微信支付

大家好,我是小悟

在抖音小程序刚出来的时候就对接过在抖音小程序里面的支付,想一下,那都是三年前的事情了。

经过这么长的时间,抖音小程序也越来越完善了,不仅体现在本身的功能上,就连开放平台也焕然一新。在体验上,不管是对开发者或者用户,都是更上一层楼的。

抽空又研究了下抖音小程序的收银台,可以支持多种渠道支付,包括抖音支付、支付宝支付、微信支付。

1、开通支付

先在小程序后台,能力-支付那边开通支付能力,开通也很简单,按要求上传资料,可以同时开通抖音、支付宝和微信支付。

审核通过后,抖音和支付宝支付是立即开通的,但是微信支付还需要微信支付管理员扫码签约,签约后会显示审核中,审核通过后会显示已开通。

抖音小程序开发,唤起收银台,包括抖音支付、支付宝支付、微信支付_第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一致,否则会拉起收银台失败。

抖音小程序开发,唤起收银台,包括抖音支付、支付宝支付、微信支付_第2张图片

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) {
    // 调起收银台失败处理逻辑
  },
});

抖音小程序开发,唤起收银台,包括抖音支付、支付宝支付、微信支付_第3张图片
在小程序后台还可以控制支付能力和收银台的支付方式。

支付能力即功能关闭后,小程序将关闭支付能力,新增订单支付将被拦截。该能力不影响历史订单的退款、分账与账户提现。

支付方式即关闭支付方式后,小程序收银台将不展示对应的支付方式,用户无法使用该支付方式进行支付。

抖音小程序开发,唤起收银台,包括抖音支付、支付宝支付、微信支付_第4张图片

您的一键三连,是我更新的最大动力,谢谢

山水有相逢,来日皆可期,谢谢阅读,我们再会

我手中的金箍棒,上能通天,下能探海

你可能感兴趣的:(抖音,小程序,支付)