東莞寮步網(wǎng)站建設(shè)自己創(chuàng)建個(gè)人免費(fèi)網(wǎng)站
文章目錄
- 一、前言
- 二、授權(quán)流程
- 三、授權(quán)Url
- 3.1 Url參數(shù)表
- 3.2 授權(quán)能力表
- 3.3 源碼示例
- 四、授權(quán)回調(diào)
- 4.1 添加授權(quán)回調(diào)接口
- 4.2 授權(quán)回調(diào)接口源碼示例
- 五、實(shí)際操作演示
- 六、參考
一、前言
目的:將抖音團(tuán)購(gòu)核銷(xiāo)的功能集成到我們自己開(kāi)發(fā)的App和小程序中
- 【團(tuán)購(gòu)核銷(xiāo)】抖音生活服務(wù)商家應(yīng)用快速接入①——基礎(chǔ)工作
- 【團(tuán)購(gòu)核銷(xiāo)】抖音生活服務(wù)商家應(yīng)用快速接入②——商家授權(quán)
- 【團(tuán)購(gòu)核銷(xiāo)】抖音生活服務(wù)商家應(yīng)用快速接入③——團(tuán)購(gòu)核銷(xiāo)驗(yàn)券
二、授權(quán)流程
- 以桿知樂(lè)(24小時(shí)自助臺(tái)球棋牌)為例。
三、授權(quán)Url
- 業(yè)務(wù)授權(quán)URL:https://auth.dylk.com/auth-isv/
https://auth.dylk.com/auth-isv/?client_key=awxxxxxxxx×tamp=1677686399&sign=xxxxxxxxxxxxxx&solution_key=1&permission_keys=1,16&out_shop_id=shop_id&charset=UTF-8&extra=aaaaaaaaaa
3.1 Url參數(shù)表
字段 | 含義 | 必填 |
---|---|---|
client_key | 服務(wù)商應(yīng)用標(biāo)示 | 是 |
timestamp | url開(kāi)始生效的秒時(shí)間戳 ?,24小時(shí)內(nèi)有效 | 是 |
solution_key | 到店餐飲1,到店團(tuán)購(gòu)2,隨心團(tuán)5 | 是 |
permission_keys? | 授權(quán)能力如2.2表 | 是 |
charset | 交互數(shù)據(jù)的編碼 固定值:UTF-8? | 是 |
sign | 根據(jù)參數(shù)內(nèi)容生成的簽名 | 是 |
client_key | 服務(wù)商應(yīng)用標(biāo)示 | 是 |
out_shop_id | 綁定抖音門(mén)店的外部門(mén)店ID | 否 |
3.2 授權(quán)能力表
?能力枚舉permission_keys? | 語(yǔ)義? |
---|---|
?1 ? | ?門(mén)店管理? |
2 | ?訂單查詢(xún)? |
3 | ?門(mén)店基礎(chǔ)信息更新? |
4 ? | ?門(mén)店任務(wù)查詢(xún)? |
?5 ? | ?同步門(mén)店戶(hù)? |
?6 ? | ?門(mén)店匹配? |
?7 ? | ?門(mén)店裝修? |
?8 ? | ?門(mén)店亮照? |
?9 ? | ?會(huì)員管理? |
?10 ? | ?商品查詢(xún)? |
?11 ? | ?商品發(fā)布? |
?12 ? | ?團(tuán)購(gòu)核銷(xiāo)? |
?13 ? | ?cps傭金設(shè)置與查詢(xún)? |
?14 ? | ?KA核銷(xiāo)對(duì)賬? |
?15 ? | ?團(tuán)購(gòu)核銷(xiāo)對(duì)賬? |
?16 ? | ?商戶(hù)授權(quán)? |
?17 ? | ?三方碼發(fā)布? |
18 ?? | 同步品牌戶(hù)? |
?19? | ?客資查詢(xún)? |
3.3 源碼示例
- 快速生成商家授權(quán)鏈接
private final static String AuthUrl = "https://auth.dylk.com/auth-isv/";public static String genAuthWithBindValidUrlFast(String outShopId) {Map<String, String> query = new HashMap<>();query.put("client_key", APPID);query.put("timestamp", String.valueOf(System.currentTimeMillis() / 1000));query.put("charset", "UTF-8");query.put("solution_key", "4");query.put("out_shop_id", outShopId);query.put("permission_keys", "1,2,10,12,14,15,16");String signResult = SignUtil.signV2(AppSecret, "", query);query.put("sign", signResult);String queryStr = query.entrySet().stream().map(entry -> new StringBuilder().append(entry.getKey()).append("=").append(entry.getValue())).collect(Collectors.joining("&"));StringBuilder resultSb = new StringBuilder(AuthUrl).append("?").append(queryStr);return resultSb.toString();
}
- 簽名加密
SignUtil.java
/*** SignV2 用于生活服務(wù)應(yīng)用計(jì)算header中的簽名(sha256) 新申請(qǐng)應(yīng)用請(qǐng)使用該方法計(jì)算* @param clientSecret 應(yīng)用secret* @param body post請(qǐng)求/spi請(qǐng)求中的body參數(shù)json字符串* @param query url參數(shù)* @return 簽名*/
public static String signV2(String clientSecret, String body, Map<String, String> query) {StringBuilder str = new StringBuilder(clientSecret);query.keySet().stream().filter(a -> !"sign".equals(a)).sorted().forEach(k -> {String val = query.get(k);str.append("&");str.append(k).append("=").append(val);});if (body != null && !"".equals(body)) {str.append("&");str.append("body").append("=").append(body);}System.out.printf("[Sign] v2 str:%s\n", str.toString());String result = SHA256(str.toString());System.out.printf("[Sign] v2 str:%s, result:%s\n", str.toString(), result);return result;
}/*** SHA-256加密* @param input 明文* @return 密文*/
public static String SHA256(String input) {String result = "";try {MessageDigest md = MessageDigest.getInstance("SHA-256");md.update(input.getBytes(StandardCharsets.UTF_8));byte[] digest = md.digest();result = bytes2Hex(digest);} catch (NoSuchAlgorithmException e) {e.printStackTrace();}return result;
}
四、授權(quán)回調(diào)
4.1 添加授權(quán)回調(diào)接口
抖音開(kāi)放平臺(tái)(服務(wù)商平臺(tái))
第三方生活服務(wù)商家應(yīng)用
開(kāi)發(fā)設(shè)置
Webhooks
- 添加你寫(xiě)好的接口,如果你的接口沒(méi)寫(xiě)好,則會(huì)提示
參數(shù)不合法
- 如果接口是ok的,則會(huì)提示添加成功。
4.2 授權(quán)回調(diào)接口源碼示例
- 校驗(yàn)簽名,加密請(qǐng)求體與請(qǐng)求體的簽名進(jìn)行對(duì)比
- 判斷是key和event無(wú)誤
- 則保存商戶(hù)授權(quán)信息
/*** 抖音推送接口*/
@PostMapping("/douyin/messages")
public String douyinMessage(@RequestBody String body, @RequestHeader Map<String, String> headers)
{log.info(body);log.info(headers.toString());// 獲取請(qǐng)求頭中的加簽信息String douyinSign = headers.get("X-Douyin-Signature");if(douyinSign==null || douyinSign.length()==0){douyinSign = headers.get("x-douyin-signature");}String data = DouYinUtils.AppSecret + body;String sign = DigestUtils.sha1Hex(data);if(!sign.equals(douyinSign)){log.error("驗(yàn)簽失敗, data="+data);log.error("驗(yàn)簽失敗, sign1="+sign);log.error("驗(yàn)簽失敗, sign2="+douyinSign);return AjaxResult.error().toString();}JSONObject douyinData = JSONObject.parseObject(body);if(douyinData.getString("client_key").equals(DouYinUtils.APPID)){if(douyinData.getString("event").equals("life_saas_cooperate_auth_with_bind")){String content = douyinData.getString("content");JSONObject jsonObject = JSONObject.parseObject(content);Long shopId = Long.valueOf(jsonObject.getString("out_shop_id"));String accountId = jsonObject.getString("account_id");String solutionKey = jsonObject.getString("solution_key");String permissionKey = jsonObject.getJSONArray("permission_keys").toJSONString();BilliardsDouyin billiardsDouyin = new BilliardsDouyin();billiardsDouyin.setAccountId(accountId);billiardsDouyin.setPermissionKeys(permissionKey);billiardsDouyin.setSolutionKey(solutionKey);billiardsDouyin.setShopId(shopId);log.info(billiardsDouyin.toString());billiardsDouyinService.insertBilliardsDouyin(billiardsDouyin);BilliardsShop billiardsShop = billiardsShopService.selectBilliardsShopById(shopId);if (ObjectUtil.isNull(billiardsShop)) {log.error("抖音商家授權(quán)回調(diào)接口,查無(wú)此球廳");return AjaxResult.error().toString();}billiardsShop.setDouyinId(accountId);billiardsShopService.updateBilliardsShop(billiardsShop);}}return douyinData.getJSONObject("content").toJSONString();
}
五、實(shí)際操作演示
六、參考
- 能力授權(quán)&門(mén)店綁定SDK_生活服務(wù)商家應(yīng)用_抖音開(kāi)放平臺(tái)
- 生活服務(wù)消息推送_生活服務(wù)商家應(yīng)用_抖音開(kāi)放平臺(tái)
覺(jué)得好,就一鍵三連唄(點(diǎn)贊+收藏+關(guān)注)