前言
本文章为企业ERP(ISV软件服务商)对接拼多多开放平台流程总结,文章包括开放平台入驻、商家授权接口流程、API调用流程(订单同步、发货回传以及其他接口的调用)、密文改造流程、拼多多电子面单调用流程、密文环境下发货流程、拼多多云服务以及服务入云流程。
(自研或者其他类型服务商请勿参考)
一、开放平台入驻
open平台地址: 拼多多 开放平台
注意事项:
1:手机号如果绑定为子账号不能再次注册开放平台账号:;
2:一个公司主体只能入驻一次,请谨慎选择入驻资质;
3:入驻资质暂时仅支持境内企业。
平台新手指南指导文档: 新手指南
使用手机号注册,密码为英文加数字加特殊符号组合,注册好后跳转到首页。
点击立即入驻。
选择开发者角色为【电商软件服务商】,入驻组织资质勾选【企业开发者】。
开发者角色的认
证业务选择【电商软件服务商】,开发者资质选择企业。
需要的资料如下图所示,按照要求填写上传。
完成后提交审核,然后可以在上方【工单支持】里发工单给平台技术支持人员,让平台同学加急审核一下。
审核完成后即可开始后续工作。
二、官方沟通工具Knock
资质申请好后先不要着急创建应用开始对接,先了解一下Knock的使用,这个工具是和官方工作人员沟通的一个途径(另一个途径是平台工单功能),平台更具不同的业务场景提供不同的官方群组,先准备好工具以及掌握使用可以提高后续的开发效率。
官方Knock介绍文档: KNOCK使用指南
子账号管理指导文档: 子账号管理
三、创建应用
注意事项:
1:要求需要上传MRD文档(市场需求文档)以及PRD文档(产品需求说明书),创建应用页面会有模板提供下载,我自己保存的模板下载地址: 拼多多开放平台应用创建所需文档模板
2:需要提供一个小于100M的视频,内容要求包括需要包含公司门头、职工办公场景,视频需要一镜到底,禁止剪辑。
【应用列表】进入【创建应用】,在【电商软件服务商】栏目下选择【企业ERP】。
官方企业ERP对接文档: 企业ERP
应用创建好后依旧需要审核,可以工单催审一下。
应用信息填写只需要注意回调地址一项,回调地址就是用来接收授权信息的服务接口地址,官方解释为:
应用创建好后,平台会根据应用权限集来提供Java开发SDK。
下载后自行配置到maven或者其他依赖管理工具里。
应用详情页会提供 client_id、client_secret 这两个应用秘钥,保存好并且不要泄露。
四、对接前准备
对接前请认真查阅以下官方提供的文档,遵守平台规则,切勿产生违规的行为:
- 官方应用开发安全管理规范文档地址: 多多云应用开发安全管理规范
- 收费规则(包括云外调用API以及云内调用的区别): 拼多多开放平台技术服务费收费规则
- 服务市场管理规范: 拼多多商家服务市场管理规范
- 服务市场保证金规则: 拼多多商家服务市场保证金规则
- 违规处理规则: 拼多多开放平台违规处理规则
- 企业ERP类目管理规范: 拼多多商家服务市场企业ERP类目管理规范
根据平台2021-04-13 11:44:11发布的规则变更公告【应用安全规范进一步改造通知】一文,要求如下:
官方改造指南文档地址: 开放平台应用安全规范改造指南
新入驻的话可以直接按要求进行对应的开发,减少后续改造工作。
第一要求:确保敏感接口调用入云,也就是涉及到敏感数据的接口调用必须在拼多多云内调用,也就是需要购买拼多多平台的云主机服务,然后在云主机上去调用这些接口;
第二要求:如上图所示;
第三要求:规定不同的应用需要分别部署到不同的云资源上,这个其实是可以部署在同一个云主机上的,云数据库需要区分开。
第四要求和第五要求:没有特殊需求的话只需要使用设置IP白名单就可以。
官方列举的接口包括以下这些:
相关敏感接口(都是包含收件人信息的接口,敏感数据也就是买家收件人信息数据,虽然是密文...):
- pdd.mall.info.get
- pdd.order.information.get
- pdd.order.list.get
- pdd.order.number.list.get
- pdd.order.number.list.increment.get
- pdd.order.status.get
- pdd.goods.information.get
- pdd.goods.detail.get
- pdd.goods.list.get
- pdd.refund.address.list.get
- pdd.refund.information.get
- pdd.refund.list.increment.get
- pdd.oversea.clearance.get
- pdd.open.decrypt.batch
开发者需要确保应用对这些接口的调用是在多多云内发起。(开发测试除外)
需要订购的云服务有(一下推荐配置可根据实际业务程度按需升配或者降配):
1:云主机,服务部署使用,官方提供linux和windows两种,推荐使用windows系统。
规格推荐:2核4G,Windows Server 2008 R2 SP1 64位 服务器版,磁盘规格60GB,大概2460/年。
官方购买云主机指导文档: 购买云主机
2:云数据库,店铺授权后,配置好数据推送绑定,数据库会同步店铺的订单信息,后续需要在此数据库内获取店铺的订单数据,配合使用出云访问服务可以把订单数据发出云,本地可以开发一个接口接收数据,并进行后续的操作。
规格推荐:1核2000M,25G存储,大概2211/年。
官方购买云数据库指导文档: 购买数据库
平台云数据库的类型列表如下:
3:对象存储 OSS服务,部署使用,Windows 云主机需要通过对象存储 OSS 来上传与下载部署所需的程序包以及其他的文件,通过OSS下载云主机上的文件的时候是需要通过审核的。
OSS服务是按使用量每日计算费用,需要部署服务的时候需要用到,其他时间不计费,使用的当天大概也就几分钱。
官方指导文档: 开通对象存储 OSS
4:出云访问服务 EGW,平台为了安全考虑,部署在云服务上的应用无法直接对外网发起访问,如果需要访问外网,比如公司的私有云服务,需要把订单数据发到公司本地的服务接口(刚需),需要使用EGW服务,推荐使用基础版。
EGW服务基础版也是按使用量收费。
其他服务按需订购使用,基础的对接开发使用以上四个服务足够。
五、对接
0、拼多多密文规则
对接前请先熟知平台敏感信息加密策略,对应文档地址: 加密接入流程
官方提供的企业ERP接入流程方案: 企业 ERP 类应用接入方案
密文规则:
敏感字段列表
- card_info_list:卡号、卡密
- inner_transaction_id:支付申报订单号
- pay_no:支付单号
- receiver_name:收件人姓名
- receiver_phone:收件人电话
- receiver_address:收件人地址,不拼接省市区
- address:收件详细地址
- id_card_name:身份证姓名
- id_card_num:身份证号
例如原收件人姓名为 【张三】,则相关接口收件人姓名字段不在推送【张三】这个明文信息, 改为密文【~AgAAAAEj89wFUIsEOACIVyeI2r7XMNRS+DzOX5wSpiE=~j8+QVnFC~5~~】这种形式;
可通过下文的获取检索串工具来获取密文的检索串,不同订单但是收件人姓名相同则密文不同但是检索串相同,可通过检索串来进行判断合并订单等操作;
检索串样式【j8+QVnFC】;
然后可通过获取脱敏数据接口: pdd.open.decrypt.mask.batch 批量数据解密脱敏接口
来获取密文的脱敏的数据,可以用来前端展示,或者报表、导出的文档展示使用,样式为【张*】
因为密文长度比较长,要把原数据库对应字段长度变更,并且需要新增两个用来存储检索串以及脱敏数据的字段。
而且密文改造后拼多多的订单要必须使用拼多多电子面单来取号打印发货,所以整个流转过程不需要明文信息,如果有特殊需求需要调用解密接口。
因为部分接口调用需要在云上调用的原因,这里提供的一个解决方案为,本地提供一个openAPI接口,云上部署一个调取订单数据以及发送到openAPI上的线程任务。
简单点来说就是:
本地服务器部署/开发用来接收云服务器请求的API接口,云服务器部署一个专门用来往接口发送数据的任务,其他业务操作在本地服务器执行,接口调用在云服务器执行。
下面会列举几个刚需的接口对接实现以及方案,实际对接可以参考一下。
1、授权
官方指导文档地址: 授权说明
授权的具体流程:
客户角度:
客户在服务市场订购本ERP服务后,可进入平台给出的授权页面:
(或在系统使用也面自行添加授权按钮,自主组装授权页URL也是 )
(拼多多店铺web端授权页面示例)
(拼多多店铺h5端授权页面示例)
系统角度:
使用店铺账号授权后,授权码code将返回到回调地址中,以参数code形式组装至回调地址中,应用可以获取并使用该code去换取access_token(接口调用需要使用的调用令牌)。
例如:我们在应用详情页填写的回调地址为 http://www.erp.com:80/pddaccess
则授权后会以 http://www.erp.com:80/pddaccess?code=asdf123asdf123 的形式请求过来。
code授权码十分钟内有效,授权码可以用来访问获取调用令牌(access_token)的接口。
code有效期内多次使用code换取access_token是一样的。
简单接收授权码code
@Controller
public class PddAccess {
@GetMapping("/pddaccess")
@ResponseBody
public void PddRe(HttpServletRequest request,HttpServletResponse response){
try{
int contentlen = request.getContentLength();
String decode = "";
if(-1 != contentlen) {
BufferedReader reader = request.getReader();
char[] buf = new char[contentlen];
int len = 0;
StringBuffer contentBuffer = new StringBuffer();
while ((len = reader.read(buf)) != -1) {
contentBuffer.append(buf, 0, len);
}
String content = contentBuffer.toString();
if (content == null) {
content = "";
}
decode = URLDecoder.decode(content, "UTF-8");
}
String code = request.getParameter("code");
System.out.println(code);
} catch (Exception e) {
logger.error("拼多多授权异常:"+e.getMessage());
}
}
}
使用授权码code 获取访问接口获取调用令牌(access_token)
(以及使用获取到的access_token获取授权的店铺信息,以便维护,数据按需保存)
API文档地址: pdd.pop.auth.token.create 获取 Access Token
获取店铺信息接口: pdd.mall.info.get 店铺信息接口
调用直接使用SDK封装好的方法,简单易用,每个API的文档下都有请求实例,几乎直接copy就可以。
// 应用的 client_id
private String clientId = "1111111111";
// 应用的 client_secret
private String clientSecret = "2222222222";
@Controller
public class PddAccess {
@GetMapping("/pddaccess")
@ResponseBody
public void PddRe(HttpServletRequest request,HttpServletResponse response){
try{
int contentlen = request.getContentLength();
String decode = "";
if(-1 != contentlen) {
BufferedReader reader = request.getReader();
char[] buf = new char[contentlen];
int len = 0;
StringBuffer contentBuffer = new StringBuffer();
while ((len = reader.read(buf)) != -1) {
contentBuffer.append(buf, 0, len);
}
String content = contentBuffer.toString();
if (content == null) {
content = "";
}
decode = URLDecoder.decode(content, "UTF-8");
}
String code = request.getParameter("code");
if(null != code && "".equals(code)){
PopClient client = new PopHttpClient(clientId, clientSecret);
PddPopAuthTokenCreateRequest pddPopAuthTokenCreateRequest = new PddPopAuthTokenCreateRequest();
pddPopAuthTokenCreateRequest.setCode(code);
PddPopAuthTokenCreateResponse pddPopAuthTokenCreateResponse = client.syncInvoke(pddPopAuthTokenCreateRequest);
String ownerId = popAuthTokenCreateResponse.getOwnerId(); // 商家店铺id,店铺唯一标识
String ownerName = popAuthTokenCreateRes