客源-营销客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);

    }

}

results matching ""

    No results matching ""