客源-营销客OpenApi实现
客源-营销客OpenApi实现
同步营销客(通用接口)
BASIC
Path: /marketing/customer/main/syncMarketingCustomer
Method: POST
Desc:
PATH前缀:/api/jediopenplatformopenapi
REQUEST
Headers:
| name | value | required |
|---|---|---|
| Content-Type | application/json | YES |
Form:
| name | value | required | type | desc |
|---|---|---|---|---|
| param.reqId | NO | string | 报文唯一标志不能为空,最大长度32 | |
| param.brokerPhone | YES | string | 经纪人手机号,与巧房内经纪人所有号码匹配,最终转换companyUuid、employeeUuid传给营销客服务。brokerPhone 字段支持加密传输,遵循开放平台加密算法,加密密钥同公司授权密钥,即appSecret | |
| param.customerName | NO | string | 客户昵称(可以不填,系统会随机生成) ,如:诸葛/房天下找房同步,有客户名用客户名称,没有客户名称自动生成诸葛/房天下用户+4 位字符 | |
| param.phone | YES | string | 客户电话,最终转换成phoneId给营销客服务。phone字段支持加密传输,遵循开放平台加密算法,加密密钥同公司授权密钥,即appSecret | |
| param.channel | YES | string | 营销客来源平台,WB-58、AJK-安居客、QT-三网其他 、QKL-巧客力、LDT-来电通、ZGZF-诸葛找房、FTX-房天下 | |
| param.cpType | NO | string | 支持渠道(诸葛找房)对投放平台(百度、幸福里、高德)的细分。 投放平台有这些, GAODE-高德、BAIDU-百度、 XFL-幸福里。 比如channel为ZGZF,但实际要区分具体投放平台来源,那么可以通过传cpType进行区分,注意:一旦传了cpType,那么营销客来源拼接就以cpType为前缀进行拼接了,如:BAIDU_PHONE_ITEM_ITEM |
|
| param.clueType | YES | string | 线索类型, 诸葛找房有这些:IM-im,FORM-话单,LZ-留咨 幸福里有这些:IM-im,FORM-话单,PHONE-电话, MATCH-抢客, LZ-留资 FTX有这些:IM-im, PHONE-来电, OTHER-其他 百度、高德有这些: IM-im, PHONE-话单, LZ-留资 |
|
| param.customerType | NO | string | 客源类型,QIU_GOU-求购,QIU_ZU-求租,ZU_SHOU-租售。不传或传其他任何值,会设置为"-" | |
| param.firstPhoneTime | YES | string | 首次留电时间 yyyyMMddHHmmss | |
| param.lastPhoneTime | YES | string | 最近一次留电时间;留电操作包括来电通微聊留电/通话、巧客力委托手机号 |
RESPONSE
Headers:
| name | value | required |
|---|---|---|
| content-type | application/json;charset=UTF-8 | NO |
Body:
| name | type | desc |
|---|---|---|
| responseCode | string | |
| responseMessage | string | |
| responseType | string | |
| errorDataMap | object | |
| |─key | object | |
| data | string |
Response Demo:
{
"responseCode": "",
"responseMessage": "",
"responseType": "",
"errorDataMap": {
"": {}
},
"data": ""
}
加密算法
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.StringUtils;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
public class AESCryptoUtil {
public static final String ENC_PREFIX = "enc:";
/**
* 加密
*
* @param content 需要加密的内容
* @param secretKey 加密秘钥
*/
public static String encrypt(String content, String secretKey) {
try {
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
secureRandom.setSeed(secretKey.getBytes(StandardCharsets.UTF_8));
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128, secureRandom);
byte[] enCodeFormat = kgen.generateKey().getEncoded();
SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
Cipher cipher = Cipher.getInstance("AES");// 创建密码器
byte[] byteContent = content.getBytes(StandardCharsets.UTF_8);
cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化
byte[] result = cipher.doFinal(byteContent);
return Base64.encodeBase64String(result);
} catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException |
IllegalBlockSizeException | BadPaddingException e) {
throw new RuntimeException(e);
}
}
/**
* 解密
* @param content 待解密内容
* @param secretKey 解密密钥
*/
public static String decrypt(byte[] content, String secretKey) {
content = java.util.Base64.getDecoder().decode(content);
try {
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
secureRandom.setSeed(secretKey.getBytes(StandardCharsets.UTF_8));
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128, secureRandom);
byte[] enCodeFormat = kgen.generateKey().getEncoded();
SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
Cipher cipher = Cipher.getInstance("AES");// 创建密码器
cipher.init(Cipher.DECRYPT_MODE, key);// 初始化
byte[] result = cipher.doFinal(content);
return new String(result,StandardCharsets.UTF_8);
} catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException |
BadPaddingException e) {
throw new RuntimeException(e);
}
}
/**
* 解密
* @param content 待解密内容
* @param secretKey 解密密钥
*/
public static String decrypt(String content, String secretKey) {
if (StringUtils.isBlank(content)) {
return content;
}
// 没有加密过不处理,兼容传明文数据
if (!content.startsWith(ENC_PREFIX)) {
return content;
}
String encryptStr = content.substring(ENC_PREFIX.length());
return decrypt(encryptStr.getBytes(), secretKey);
}
public static void main(String[] args) {
String secretKey ="e806d7148*******c6c8d7e224df5b";
String content = "13812345678";
//加密
String jiami = ENC_PREFIX + encrypt(content, secretKey);
//解密
String jiemi = decrypt(jiami, secretKey);
System.err.println(jiami);
System.err.println(jiemi);
}
}