design bu leezec 296066606
应用实例
T100销售订单推送到CRM
需求分解:1.调用销售易接口校验取得token 2.取得token后按照要求推送数据
1.什么是token?
首先,要调用CRM的实际应用场景,就绕不开一个安全校验机制,叫做接口鉴权,也叫token,是一个在外部网络环境防止数据泄漏的一个验证,通常会提供一个账号密码,以特定的加密方式传输到指定服务器,获得一个授权码,然后根据这个授权码才能调用实际应用场景,目前这样的接口校验方式已经成为主流
2.为什么要用token?
销售易是一个云平台,接口调用有统一的域名,能区分身份的就是token了,根据token会把你的请求内容更新到属于你的账号数据里面,好比销售易是一家银行,token就是银行卡账号,你去银行转账才不会把张三的芒尼存到李四的账号
一,token获取开发
首先看下销售易的token文档:
通过文档得知:要成功获取token,需要的内容有
由于销售易的api支持个性定制化,所以后面附上的域名信息和文档略有不同
1.请求地址 :https://login.xiaoshouyi.com/auc/oauth2/token
2.请求方式 :get
3.请求参数 :grant_type,client_id,client_secret,redirect_uri
4.返回结构 :主要提取access_token
{
"id": 15441****7509, #去敏处理
"access_token": "39eebeb9****99.MTU0NDEwOTYxNTA0MTE3Mg==0", #去敏处理
"issued_at": 166****119, #去敏处理
"token_type": "Bearer"
}
附上T100调用销售易API获取token的源码(关键信息去敏处理):
PUBLIC FUNCTION cs_crm_get_token()
DEFINE req com.HTTPRequest
DEFINE resp com.HTTPResponse
DEFINE p_req_url STRING
DEFINE p_pos_param STRING
DEFINE l_req STRING
DEFINE l_response STRING
DEFINE l_date DATETIME YEAR TO SECOND
DEFINE l_param_r RECORD
id LIKE type_t.chr1000,
access_token LIKE type_t.chr1000,
issued_at LIKE type_t.chr1000,
token_type LIKE type_t.chr1000
END RECORD
DEFINE l_token LIKE gzzg_t.gzzg005
DEFINE g_logfile STRING #日志文件名称
DEFINE g_logdate STRING #日志日期
DEFINE ch base.Channel #写入日志
DEFINE g_logcont STRING #日志文件内容
LET p_req_url='https://api-tencent.xiaoshouyi.com/oauth2/token.action'
LET p_pos_param='?grant_type=password&client_id=77******7f2&client_secret=e***dc8a9aa&redirect_uri=https://api-tencent.xiaoshouyi.com&username=1**5&password=***' #*号内容去敏处理
LET g_logdate=YEAR(CURRENT) USING "####",MONTH(CURRENT) USING "&&",DAY(CURRENT) USING "&&"#,TIME(CURRENT)
LET g_logfile=FGL_GETENV("LOGDIR")
LET g_logfile=g_logfile,'/cs_oa_',g_logdate,".log"
DISPLAY g_logfile
LET ch=base.Channel.create()
CALL ch.setDelimiter("")
CALL ch.openFile(g_logfile,"a")
LET g_logcont='=============================================================='
CALL ch.writeLine(g_logcont)
CALL ch.writeLine('request:')
LET l_date=cl_get_current()
LET g_logcont=' time:',l_date,' \r\n g_prog:',g_prog,' \r\n req_url:',p_req_url,' \r\n pos_param:',p_pos_param,'\r\n'
CALL ch.writeLine(g_logcont)
DISPLAY 'URL:',p_req_url
LET l_req=p_req_url,p_pos_param
TRY
LET req = com.HTTPRequest.Create(l_req)
CALL req.setCharset("UTF-8")
#CALL req.setHeader("ContentLength", p_pos_param.getLength())
#CALL req.setHeader("Content-Type","application/json")
CALL req.setMethod("GET")
#CALL req.doTextRequest(p_pos_param)
CALL req.doRequest()
CALL req.setConnectionTimeOut(120)
DISPLAY req
LET resp = req.getResponse()
#获取发送请求后服务器返回的状态码,200为正常访问
IF resp.getStatusCode() != 200 THEN
DISPLAY "HTTP Error (" || resp.getStatusCode() || ") ", resp.getStatusDescription()
ELSE
#获取请求返回的json字符串
LET l_response = resp.getTextResponse()
CALL util.JSON.parse(l_response,l_param_r) #解析json字串转成变量
LET l_token=l_param_r.access_token
END IF
DISPLAY l_response
CATCH
# Error occured from Genero system
# 客戶端連線錯誤 ( 錯誤代碼: %1 )
INITIALIZE g_errparam TO NULL
LET g_errparam.code = "lib-00427"
LET g_errparam.extend = ''
LET g_errparam.popup = TRUE
CALL cl_err()
LET l_token = NULL
END TRY
CALL ch.writeLine('Reponse:')
LET g_logcont=l_response
CALL ch.writeLine(g_logcont)
LET g_logcont='==============================================================\r\n\r\n\r\n'
CALL ch.writeLine(g_logcont)
CALL ch.close()
RETURN l_token
END FUNCTION
二,订单推送开发
取得token之后,就是要推送实际的订单系统数据了,由于销售易的结构特殊性,订单的单头和单身分开的,所以实际上是两个接口,订单单头推送一份,单身推送一份,并且单身不是数组类型,需要逐笔推送,附上源码
#該程式未解開Section, 採用最新樣板產出!
#該程式為freestyle程式!
{<section id="cs_axmt500_send.description" type="s" >}
#應用 a00 樣板自動產生(Version:3)
#+ Standard Version.....: SD版次:0001(1900-01-01 00:00:00), PR版次:
#+ Customerized Version.: SD版次:0001(1900-01-01 00:00:00), PR版次:
#+ Build......: 000140
#+ Filename...: cs_axmt500_send
#+ Description: 推送訂單信息到crm
#+ Creator....: TIPTOP(2021-09-16 09:37:36)
#+ Modifier...: 00000 -SD/PR-
{</section>}
{<section id="cs_axmt500_send.global" type="s" >}
#應用 p00 樣板自動產生(Version:6)
#add-point:填寫註解說明 name="main.memo"
#end add-point
#add-point:填寫註解說明(客製用) name="main.memo_customerization"
#end add-point
#(ver:6) ---start---
#add-point:填寫註解說明(行業用) name="global.memo_industry"
#end add-point
#(ver:6) --- end ---
IMPORT os
#add-point:增加匯入項目 name="main.import"
IMPORT FGL WSHelper
IMPORT com
IMPORT util
IMPORT xml
#end add-point
SCHEMA ds
GLOBALS "../../cfg/top_global.inc"
#add-point:增加匯入變數檔 name="global.inc"
DEFINE l_remote_ip STRING
DEFINE l_service STRING
DEFINE l_req_url STRING
DEFINE js STRING
DEFINE l_token STRING
DEFINE r_success LIKE type_t.num5
DEFINE l_response VARCHAR(5000)
DEFINE l_request STRING
DEFINE l_orderId LIKE type_t.chr1000
DEFINE l_orderproduct LIKE type_t.chr1000
DEFINE l_timestamp CHAR(13)
DEFINE g_type LIKE type_t.chr1
#end add-point
{</section>}
{<section id="cs_axmt500_send.free_style_variable" type="s" >}
#add-point:free_style模組變數(Module Variable) name="free_style.variable"
TYPE type_order RECORD
entityType LIKE type_t.chr1000,
po LIKE type_t.chr1000,
accountId LIKE type_t.chr1000,
customItem183__c LIKE type_t.chr1000,
ownerId LIKE type_t.chr1000,
dimDepart LIKE type_t.chr1000,
customItem188__c LIKE type_t.chr1000,
customItem189__c LIKE type_t.chr1000,
customItem194__c LIKE type_t.chr1000,
customItem195__c LIKE type_t.chr1000,
contactAddress LIKE type_t.chr1000,
comment LIKE type_t.chr1000,
customItem198__c LIKE type_t.chr1000,
customItem184__c LIKE type_t.chr1000,
customItem182__c LIKE type_t.chr1000,
customItem192__c LIKE type_t.chr1000,
customItem193__c LIKE type_t.chr1000,
customItem191__c LIKE type_t.chr1000,
customItem196__c LIKE type_t.chr1000,
customItem197__c LIKE type_t.chr1000,
customItem190__c LIKE type_t.chr1000,
customItem207__c LIKE type_t.chr1000,
customItem209__c LIKE type_t.chr1000,
customItem201__c LIKE type_t.chr1000,
customItem202__c LIKE type_t.chr1000
END RECORD
DEFINE l_param_order RECORD --单头
data type_order
END RECORD
TYPE type_orderproduct RECORD
entityType LIKE type_t.chr1000,
name LIKE type_t.chr1000,
productId LIKE type_t.chr1000,
quantity LIKE type_t.chr1000,
customItem180__c LIKE type_t.chr1000,
listTotal LIKE type_t.chr1000,
customItem188__c LIKE type_t.chr1000,
unitPrice LIKE type_t.chr1000,
standardPrice LIKE type_t.chr1000,
customItem183__c LIKE type_t.chr1000,
comment LIKE type_t.chr1000,
customItem187__c LIKE type_t.chr1000,
customItem186__c LIKE type_t.chr1000,
customItem184__c LIKE type_t.chr1000,
customItem181__c LIKE type_t.chr1000,
customItem185__c LIKE type_t.chr1000,
discount LIKE type_t.chr1000,
customItem179__c LIKE type_t.chr1000,
customItem182__c LIKE type_t.chr1000,
orderId LIKE type_t.chr1000
END RECORD
DEFINE l_param_orderproduct RECORD --单身
data type_orderproduct
END RECORD
TYPE type_data_r RECORD
id LIKE type_t.chr1000,
objectApiKey LIKE type_t.chr1000,
busiType LIKE type_t.chr1000,
name LIKE type_t.chr1000
END RECORD
DEFINE l_param_r RECORD --返回值
code LIKE type_t.chr1000,
msg LIKE type_t.chr1000,
errorInfo LIKE type_t.chr1000
END RECORD
DEFINE l_param_data_r RECORD --返回值
data type_data_r
END RECORD
TYPE type_updatejson RECORD
id LIKE type_t.chr1000,
po LIKE type_t.chr1000
END RECORD
DEFINE l_param_order_up RECORD --单头标题修改
objectapi LIKE type_t.chr1000,
id LIKE type_t.chr1000,
updatejson type_updatejson
END RECORD
#end add-point
{</section>}
{<section id="cs_axmt500_send.global_variable" type="s" >}
#add-point:自定義模組變數(Module Variable) name="global.variable"
DEFINE l_cmd LIKE type_t.chr1
DEFINE g_logfile STRING #日志文件名称
DEFINE g_logdate STRING #日志日期
DEFINE ch base.Channel #写入日志
DEFINE g_logcont STRING #日志文件内容
#end add-point
{</section>}
{<section id="cs_axmt500_send.other_dialog" type="s" >}
{</section>}
{<section id="cs_axmt500_send.other_function" readonly="Y" type="s" >}
################################################################################
# Descriptions...: 描述说明
# Memo...........:
# Usage..........: CALL s_aooi150_ins (传入参数)
# RETURNING 回传参数
# Input parameter: 传入参数变量1 传入参数变量说明1
# : 传入参数变量2 传入参数变量说明2
# Return code....: 回传参数变量1 回传参数变量说明1
# : 回传参数变量2 回传参数变量说明2
# Date & Author..: 日期 By 作者
# Modify.........:
################################################################################
PUBLIC FUNCTION cs_axmt500_send(p_docno)
DEFINE p_docno LIKE type_t.chr1000 #单据编号
DEFINE l_stus LIKE type_t.chr10 #单据状态
DEFINE l_xmda006 LIKE xmda_t.xmda006
DEFINE l_xmdaud009 LIKE xmda_t.xmdaud009
DEFINE l_xmdaud010 LIKE xmda_t.xmdaud010
DEFINE l_xmda RECORD LIKE xmda_t.*
DEFINE l_xmdc RECORD LIKE xmdc_t.*
DEFINE g_sql STRING
DEFINE l_json_obj util.JSONObject
DEFINE l_success LIKE type_t.num5
DEFINE l_i LIKE type_t.num5
DEFINE l_id LIKE type_t.chr1000
DEFINE l_time LIKE type_t.chr10
DEFINE p_type LIKE type_t.chr1
WHENEVER ERROR CONTINUE
LET r_success = TRUE
LET g_type = p_type
IF cl_get_para(g_enterprise,g_site,'S-SYSC0008') <> 'Y' THEN
RETURN r_success
END IF
LET l_orderId = NULL
LET l_orderproduct = NULL
IF cl_null(p_docno) THEN
#傳入單據編號為空;請指定單據編號!
INITIALIZE g_errparam TO NULL
LET g_errparam.code = 'sub-00228'
LET g_errparam.extend = p_docno
LET g_errparam.popup = TRUE
CALL cl_err()
LET r_success = FALSE
RETURN r_success
END IF
LET l_xmda006=NUll
SELECT xmda006 INTO l_xmda006
FROM xmda_t
WHERE xmdaent=g_enterprise
AND xmdadocno=p_docno
IF l_xmda006 NOT MATCHES '[12]' THEN
RETURN r_success
END IF
LET l_stus = ''
SELECT xmdastus INTO l_stus
FROM xmda_t
WHERE xmdaent=g_enterprise
AND xmdadocno=p_docno
IF l_stus = 'X' THEN
#此筆資料已經作廢;請確認狀態碼!
INITIALIZE g_errparam TO NULL
LET g_errparam.code = 'sub-00229'
LET g_errparam.extend = p_docno
LET g_errparam.popup = TRUE
CALL cl_err()
LET r_success = FALSE
RETURN r_success
END IF
IF l_stus <> 'Y' THEN
INITIALIZE g_errparam TO NULL
LET g_errparam.code = 'axm-00027'
LET g_errparam.extend = p_docno
LET g_errparam.popup = TRUE
CALL cl_err()
LET r_success = FALSE
RETURN r_success
END IF
LET l_xmdaud009=NULL
LET l_xmdaud010=NULL
SELECT xmdaud009,xmdaud010
INTO l_xmdaud009,l_xmdaud010
FROM xmda_t
WHERE xmdaent=g_enterprise
AND xmdadocno=p_docno
IF NOT cl_null(l_xmdaud009) THEN
INITIALIZE g_errparam TO NULL
LET g_errparam.code = 'cxm-00060' --已经产生对应单据
LET g_errparam.extend = p_docno
LET g_errparam.popup = TRUE
CALL cl_err()
LET r_success = FALSE
RETURN r_success
END IF
#檢查:應在事物中的
IF NOT s_transaction_chk('Y','0') THEN
LET r_success = FALSE
RETURN r_success
END IF
#获取token --一直用这个token
LET l_token=NULL
CALL cs_crm_get_token() RETURNING l_token
IF cl_null(l_token) THEN
INITIALIZE g_errparam TO NULL
LET g_errparam.code = 'cws-00200'
LET g_errparam.extend = ''
LET g_errparam.popup = TRUE
CALL cl_err()
RETURN FALSE
ELSE
LET l_token="Bearer ",l_token
END IF
LET l_id = ''
SELECT wslauc002 INTO l_id FROM wslauc_t
WHERE wslaucent = g_enterprise
AND wslauc001 = p_docno
AND wslauc002 <> 'Y'
IF NOT cl_null(l_id) THEN
LET l_req_url = "https://api-tencent.xiaoshouyi.com/rest/data/v2.0/xobjects/order/",l_id,""
CALL cs_crm_delete(l_req_url,l_token) RETURNING l_success
IF NOT l_success THEN #
INITIALIZE g_errparam TO NULL
LET g_errparam.code = '!'
LET g_errparam.extend = 'CRM已存在该订单记录,且无法删除,请联系IT检查!'
LET g_errparam.popup = TRUE
CALL cl_err()
RETURN FALSE
END IF
UPDATE wslauc_t SET wslauc003 ='Y'
WHERE wslaucent = g_enterprise
AND wslauc001 = p_docno
AND wslauc002 = l_id
END IF
LET l_cmd='a'
SELECT *
INTO l_xmda.*
FROM xmda_t
WHERE xmdaent=g_enterprise
AND xmdadocno=p_docno
CALL cs_axmt500_send_master(l_xmda.*) RETURNING r_success
LET ch=base.Channel.create()
CALL ch.setDelimiter("")
CALL ch.openFile(g_logfile,"a")
LET g_logcont='r_success1:',r_success
CALL ch.writeLine(g_logcont)
LET g_logcont='=======\n'
CALL ch.writeLine(g_logcont)
CALL ch.close()
IF r_success THEN
CALL util.JSON.parse(l_response,l_param_data_r)
LET l_orderId=l_param_data_r.data.id --crm返回的id
CALL cs_axmt500_send_master_up(l_xmda.*) RETURNING r_success
LET ch=base.Channel.create()
CALL ch.setDelimiter("")
CALL ch.openFile(g_logfile,"a")
LET g_logcont='r_success2:',r_success
CALL ch.writeLine(g_logcont)
LET g_logcont='=======\n'
CALL ch.writeLine(g_logcont)
CALL ch.close()
IF r_success THEN
LET g_sql = "SELECT * FROM xmdc_t WHERE xmdcent='",g_enterprise,"' AND xmdcdocno='",p_docno,"' "
PREPARE cs_detail_p FROM g_sql
DECLARE cs_detail_c CURSOR FOR cs_detail_p
FOREACH cs_detail_c INTO l_xmdc.*
CALL cs_axmt500_send_detail(l_xmdc.*) RETURNING r_success
LET ch=base.Channel.create()
CALL ch.setDelimiter("")
CALL ch.openFile(g_logfile,"a")
LET g_logcont='r_success3:',r_success
CALL ch.writeLine(g_logcont)
LET g_logcont='=======\n'
CALL ch.writeLine(g_logcont)
CALL ch.close()
IF NOT r_success THEN
EXIT FOREACH
END IF
IF r_success THEN
CALL util.JSON.parse(l_response,l_param_data_r)
LET l_orderproduct=l_param_data_r.data.id --crm返回的id
UPDATE xmdc_t
SET xmdcud010=l_orderproduct
WHERE xmdcent=g_enterprise
AND xmdcdocno=p_docno
AND xmdcseq=l_xmdc.xmdcseq
IF SQLCA.SQLCODE THEN
INITIALIZE g_errparam TO NULL
LET g_errparam.extend = "g_xmda_m:",SQLERRMESSAGE
LET g_errparam.code = SQLCA.SQLCODE
LET g_errparam.popup = TRUE
CALL cl_err()
LET r_success=FALSE
END IF
LET ch=base.Channel.create()
CALL ch.setDelimiter("")
CALL ch.openFile(g_logfile,"a")
LET g_logcont='r_success4:',r_success
CALL ch.writeLine(g_logcont)
LET g_logcont='=======\n'
CALL ch.writeLine(g_logcont)
CALL ch.close()
IF NOT r_success THEN
EXIT FOREACH
END IF
END IF
END FOREACH
END IF
END IF
IF r_success THEN
UPDATE xmda_t
SET xmdaud009=l_orderId
WHERE xmdaent=g_enterprise
AND xmdadocno=p_docno
IF SQLCA.SQLCODE THEN
INITIALIZE g_errparam TO NULL
LET g_errparam.extend = "g_xmda_m:",SQLERRMESSAGE
LET g_errparam.code = SQLCA.SQLCODE
LET g_errparam.popup = TRUE
CALL cl_err()
LET r_success=FALSE
END IF
END IF
LET ch=base.Channel.create()
CALL ch.setDelimiter("")
CALL ch.openFile(g_logfile,"a")
LET g_logcont='r_success5:',r_success
CALL ch.writeLine(g_logcont)
LET g_logcont='=======\n'
CALL ch.writeLine(g_logcont)
CALL ch.close()
####如果错误则删除CRM数据
IF NOT cl_null(l_orderId) AND NOT r_success THEN
LET l_success = TRUE
FOR l_i = 1 TO 3
LET l_req_url = "https://api-tencent.xiaoshouyi.com/rest/data/v2.0/xobjects/order/",l_orderId,""
CALL cs_crm_delete(l_req_url,l_token) RETURNING l_success
IF l_success THEN
EXIT FOR
END IF
sleep 5
END FOR
LET ch=base.Channel.create()
CALL ch.setDelimiter("")
CALL ch.openFile(g_logfile,"a")
LET g_logcont='l_success6:',l_success
CALL ch.writeLine(g_logcont)
LET g_logcont='=======\n'
CALL ch.writeLine(g_logcont)
CALL ch.close()
IF NOT l_success THEN #删除失败则记录单据,待下次处理
LET l_time = TIME
INSERT INTO wslauc_t(wslaucent,wslauc001,wslauc002,wslauc003,wslauc004,wslauc005)
VALUES (g_enterprise,p_docno,l_orderId,'N',g_today,l_time)
END IF
END IF
RETURN r_success
END FUNCTION
################################################################################
# Descriptions...: 描述说明
# Memo...........:
# Usage..........: CALL s_aooi150_ins (传入参数)
# RETURNING 回传参数
# Input parameter: 传入参数变量1 传入参数变量说明1
# : 传入参数变量2 传入参数变量说明2
# Return code....: 回传参数变量1 回传参数变量说明1
# : 回传参数变量2 回传参数变量说明2
# Date & Author..: 日期 By 作者
# Modify.........:
################################################################################
PUBLIC FUNCTION cs_axmt500_send_master(l_xmda)
DEFINE l_xmda RECORD LIKE xmda_t.*
DEFINE l_json_obj util.JSONObject
DEFINE l_ownerId LIKE type_t.chr1000
DEFINE l_dimDepart LIKE type_t.chr1000
DEFINE g_slip LIKE oobal_t.oobal002
DEFINE l_success LIKE type_t.num5
INITIALIZE l_param_order.data.* TO NULL
CASE l_xmda.xmda048
WHEN '1'
LET l_param_order.data.entityType = '1544126532993732'
WHEN '2'
LET l_param_order.data.entityType = '1905875652788871'
END CASE
LET l_param_order.data.po = l_xmda.xmdadocno --单号
LET l_param_order.data.accountId = cs_axmt500_send_value('pmaa_t',l_xmda.xmda004)
LET l_param_order.data.customItem183__c = cs_axmt500_send_xmcmuc004('order','customItem183__c',l_xmda.xmdasite)
CALL cs_crm_get_ownerid(l_token,l_xmda.xmda004) RETURNING l_ownerId,l_dimDepart
LET l_param_order.data.ownerId = l_ownerId
LET l_param_order.data.dimDepart = l_dimDepart
LET l_param_order.data.customItem188__c = cs_axmt500_send_xmcmuc004('order','customItem188__c',l_xmda.xmda005)
LET l_param_order.data.customItem189__c = cs_axmt500_send_xmcmuc004('order','customItem189__c',l_xmda.xmda006)
LET l_param_order.data.customItem194__c = l_xmda.xmda021
LET l_param_order.data.customItem195__c = l_xmda.xmda022
LET l_param_order.data.contactAddress = l_xmda.xmdaua001
LET l_param_order.data.comment = l_xmda.xmda071
LET l_param_order.data.customItem198__c = cs_axmt500_send_value('xmdx_t',l_xmda.xmdaud005)
LET l_param_order.data.customItem184__c = cs_axmt500_send_xmcmuc004('order','customItem184__c',l_xmda.xmdastus)
LET l_param_order.data.customItem182__c = cs_axmt500_send_xmcmuc004('order','customItem182__c',l_xmda.xmda019)
LET l_param_order.data.customItem192__c = cs_axmt500_send_xmcmuc004('order','customItem192__c',l_xmda.xmda009)
LET l_param_order.data.customItem193__c = cs_axmt500_send_xmcmuc004('order','customItem193__c',l_xmda.xmda010)
LET l_param_order.data.customItem191__c = cs_axmt500_send_xmcmuc004('order','customItem191__c',l_xmda.xmda011)
LET l_param_order.data.customItem196__c = cs_axmt500_send_xmcmuc004('order','customItem196__c',l_xmda.xmda035)
CALL s_aooi200_get_slip(l_xmda.xmdadocno) RETURNING l_success,g_slip
LET l_param_order.data.customItem197__c = cs_axmt500_send_xmcmuc004('order','customItem197__c',g_slip)
LET l_param_order.data.customItem190__c = l_xmda.xmda050
LET l_param_order.data.customItem207__c = '1'
LET l_param_order.data.customItem209__c = l_xmda.xmdadocno
LET l_param_order.data.customItem201__c = l_xmda.xmda002
LET l_param_order.data.customItem202__c = l_xmda.xmda003
LET l_json_obj = util.JSONObject.fromFGL(l_param_order)
LET l_request = l_json_obj.toString()
#LET l_request = cl_replace_str(l_request,"null","' '") #把null替换成空格
LET l_request = cl_replace_str(l_request,"'",'"') #把'替换"
LET l_req_url = "https://api-tencent.xiaoshouyi.com/rest/data/v2.0/xobjects/order"
CALL cs_axmt500_send_http_req(l_req_url,l_request) RETURNING r_success
RETURN r_success
END FUNCTION
################################################################################
# Descriptions...: 描述说明
# Memo...........:
# Usage..........: CALL s_aooi150_ins (传入参数)
# RETURNING 回传参数
# Input parameter: 传入参数变量1 传入参数变量说明1
# : 传入参数变量2 传入参数变量说明2
# Return code....: 回传参数变量1 回传参数变量说明1
# : 回传参数变量2 回传参数变量说明2
# Date & Author..: 日期 By 作者
# Modify.........:
################################################################################
PUBLIC FUNCTION cs_axmt500_send_master_up(l_xmda)
DEFINE l_xmda RECORD LIKE xmda_t.*
DEFINE l_json_obj util.JSONObject
INITIALIZE l_param_order_up.* TO NULL
LET l_param_order_up.objectapi = 'order'
LET l_param_order_up.id = l_orderId
LET l_param_order_up.updatejson.id = l_orderId
LET l_param_order_up.updatejson.po = l_xmda.xmdadocno
LET l_json_obj = util.JSONObject.fromFGL(l_param_order_up)
LET l_request = l_json_obj.toString()
LET l_request = cl_replace_str(l_request,"'",'"') #把'替换"
LET l_req_url = "https://api-tencent.xiaoshouyi.com/rest/data/v2.0/scripts/api/updateapi"
CALL cs_axmt500_send_http_req(l_req_url,l_request) RETURNING r_success
RETURN r_success
END FUNCTION
################################################################################
# Descriptions...: 描述说明
# Memo...........:
# Usage..........: CALL s_aooi150_ins (传入参数)
# RETURNING 回传参数
# Input parameter: 传入参数变量1 传入参数变量说明1
# : 传入参数变量2 传入参数变量说明2
# Return code....: 回传参数变量1 回传参数变量说明1
# : 回传参数变量2 回传参数变量说明2
# Date & Author..: 日期 By 作者
# Modify.........:
################################################################################
PUBLIC FUNCTION cs_axmt500_send_detail(l_xmdc)
DEFINE l_xmdc RECORD LIKE xmdc_t.*
DEFINE l_json_obj util.JSONObject
INITIALIZE l_param_orderproduct.data.* TO NULL
LET l_param_orderproduct.data.entityType ='1544126618862228'
LET l_param_orderproduct.data.name =l_xmdc.xmdcseq
LET l_param_orderproduct.data.productId =cs_axmt500_send_value('imaa_t',l_xmdc.xmdc001)
LET l_param_orderproduct.data.quantity =l_xmdc.xmdc007
LET l_timestamp=NULL
SELECT (l_xmdc.xmdc012 - TO_DATE('1970-1-1 8', 'YYYY-MM-DD HH24')) * 86400000 INTO l_timestamp FROM dual
LET l_param_orderproduct.data.customItem180__c =l_timestamp
LET l_param_orderproduct.data.listTotal =l_xmdc.xmdcud015 * l_xmdc.xmdc007
LET l_param_orderproduct.data.customItem188__c =l_xmdc.xmdcud012
LET l_param_orderproduct.data.unitPrice =l_xmdc.xmdc015
LET l_param_orderproduct.data.standardPrice =l_xmdc.xmdcud015
LET l_param_orderproduct.data.customItem183__c =cs_axmt500_send_xmcmuc004('orderProduct','customItem183__c',l_xmdc.xmdc045)
LET l_param_orderproduct.data.comment =l_xmdc.xmdc050
LET l_param_orderproduct.data.customItem187__c =l_xmdc.xmdcud003
LET l_param_orderproduct.data.customItem186__c =cs_axmt500_send_xmcmuc004('orderProduct','customItem186__c',l_xmdc.xmdcud004)
LET l_param_orderproduct.data.customItem184__c =l_xmdc.xmdcud006
LET l_param_orderproduct.data.customItem181__c =cs_axmt500_send_xmcmuc004('orderProduct','customItem181__c',l_xmdc.xmdcud007)
LET l_param_orderproduct.data.customItem185__c =l_xmdc.xmdcud014
LET l_param_orderproduct.data.discount =l_xmdc.xmdcud016
LET l_timestamp=NULL
SELECT (l_xmdc.xmdc012 - TO_DATE('1970-1-1 8', 'YYYY-MM-DD HH24')) * 86400000 INTO l_timestamp FROM dual
LET l_param_orderproduct.data.customItem179__c =l_timestamp
LET l_param_orderproduct.data.customItem182__c =cs_axmt500_send_xmcmuc004('orderProduct','customItem182__c',l_xmdc.xmdc052)
LET l_param_orderproduct.data.orderId =l_orderId
LET l_json_obj = util.JSONObject.fromFGL(l_param_orderproduct)
LET l_request = l_json_obj.toString()
#LET l_request = cl_replace_str(l_request,"null","' '") #把null替换成空格
--LET l_request = cl_replace_str(l_request,"'",'"') #把'替换"
LET l_req_url = "https://api-tencent.xiaoshouyi.com/rest/data/v2.0/xobjects/orderProduct"
CALL cs_axmt500_send_http_req(l_req_url,l_request) RETURNING r_success
RETURN r_success
END FUNCTION
################################################################################
# Descriptions...: 描述说明
# Memo...........:
# Usage..........: CALL s_aooi150_ins (传入参数)
# RETURNING 回传参数
# Input parameter: 传入参数变量1 传入参数变量说明1
# : 传入参数变量2 传入参数变量说明2
# Return code....: 回传参数变量1 回传参数变量说明1
# : 回传参数变量2 回传参数变量说明2
# Date & Author..: 日期 By 作者
# Modify.........:
################################################################################
PUBLIC FUNCTION cs_axmt500_send_http_req(p_req_url,p_pos_param)
DEFINE req com.HTTPRequest
DEFINE resp com.HTTPResponse
DEFINE p_req_url STRING
DEFINE p_pos_param STRING
DEFINE l_str STRING
DEFINE l_date DATETIME YEAR TO SECOND
LET g_logdate=YEAR(CURRENT) USING "####",MONTH(CURRENT) USING "&&",DAY(CURRENT) USING "&&"#,TIME(CURRENT)
LET g_logfile=FGL_GETENV("LOGDIR")
LET g_logfile=g_logfile,'/cs_crm_',g_logdate,".log"
DISPLAY g_logfile
LET ch=base.Channel.create()
CALL ch.setDelimiter("")
CALL ch.openFile(g_logfile,"a")
LET g_logcont='=============================================================='
CALL ch.writeLine(g_logcont)
CALL ch.writeLine('request:')
LET l_date=cl_get_current()
LET g_logcont=' time:',l_date,' \r\n g_prog:',g_prog,' \r\n req_url:',p_req_url,' \r\n pos_param:',p_pos_param,'\r\n'
CALL ch.writeLine(g_logcont)
DISPLAY 'URL:',p_req_url
LET req = com.HTTPRequest.Create(p_req_url)
CALL req.clearHeaders()
CALL req.setCharset("UTF-8")
CALL req.setHeader("ContentLength", p_pos_param.getLength())
CALL req.setHeader("Content-Type","application/json")
CALL req.setHeader("Authorization",l_token)
CALL req.setMethod("POST")
CALL req.doTextRequest(p_pos_param)
CALL req.setConnectionTimeOut(120)
DISPLAY req
LET resp = req.getResponse()
#获取发送请求后服务器返回的状态码,200为正常访问
IF resp.getStatusCode() != 200 THEN
LET l_response="HTTP ERROR (" || resp.getStatusCode() || ") ", resp.getStatusDescription()
LET r_success = FALSE
ELSE
#获取请求返回的json字符串
LET l_response = resp.getTextResponse()
CALL util.JSON.parse(l_response,l_param_r)
IF cl_null(l_param_r.code) OR l_param_r.code<>'200' THEN
INITIALIZE g_errparam TO NULL
LET g_errparam.code = 'aws-00130'
LET g_errparam.extend = l_param_r.msg,':',l_param_orderproduct.data.name
LET g_errparam.popup = TRUE
LET r_success = FALSE
CALL cl_err()
END IF
END IF
DISPLAY l_response
CALL ch.writeLine('Reponse:')
LET g_logcont=l_response
CALL ch.writeLine(g_logcont)
LET g_logcont='==============================================================\r\n\r\n\r\n'
CALL ch.writeLine(g_logcont)
CALL ch.close()
RETURN r_success
END FUNCTION
################################################################################
# Descriptions...: 描述说明
# Memo...........:
# Usage..........: CALL s_aooi150_ins (传入参数)
# RETURNING 回传参数
# Input parameter: 传入参数变量1 传入参数变量说明1
# : 传入参数变量2 传入参数变量说明2
# Return code....: 回传参数变量1 回传参数变量说明1
# : 回传参数变量2 回传参数变量说明2
# Date & Author..: 日期 By 作者
# Modify.........:
################################################################################
PUBLIC FUNCTION cs_axmt500_send_xmcmuc004(l_xmcmuc001,l_xmcmuc002,l_xmcmuc003)
DEFINE l_xmcmuc001 LIKE xmcmuc_t.xmcmuc001
DEFINE l_xmcmuc002 LIKE xmcmuc_t.xmcmuc002
DEFINE l_xmcmuc003 LIKE xmcmuc_t.xmcmuc003
DEFINE l_xmcmuc004 LIKE xmcmuc_t.xmcmuc004
LET l_xmcmuc004=NULL
SELECT xmcmuc004 INTO l_xmcmuc004
FROM xmcmuc_t
WHERE xmcmucent=g_enterprise
AND xmcmuc001=l_xmcmuc001
AND xmcmuc002=l_xmcmuc002
AND xmcmuc003=l_xmcmuc003
RETURN l_xmcmuc004
END FUNCTION
################################################################################
# Descriptions...: 描述说明
# Memo...........:
# Usage..........: CALL s_aooi150_ins (传入参数)
# RETURNING 回传参数
# Input parameter: 传入参数变量1 传入参数变量说明1
# : 传入参数变量2 传入参数变量说明2
# Return code....: 回传参数变量1 回传参数变量说明1
# : 回传参数变量2 回传参数变量说明2
# Date & Author..: 日期 By 作者
# Modify.........:
################################################################################
PUBLIC FUNCTION cs_axmt500_send_value(l_table,l_erpkey)
DEFINE l_table LIKE type_t.chr100
DEFINE l_erpkey LIKE type_t.chr100
DEFINE l_value LIKE type_t.chr100
LET l_value=null
CASE l_table
WHEN 'pmaa_t'
SELECT pmaaud003 INTO l_value FROM pmaa_t WHERE pmaaent=g_enterprise AND pmaa001=l_erpkey
WHEN 'xmdx_t'
SELECT xmdxud009 INTO l_value FROM xmdx_t WHERE xmdxent=g_enterprise AND xmdxsite=g_site AND xmdxud008=l_erpkey
WHEN 'imaa_t'
SELECT imaaud008 INTO l_value FROM imaa_t WHERE imaaent=g_enterprise AND imaa001=l_erpkey
END CASE
RETURN l_value
END FUNCTION
{</section>}
本文只是以销售易CRM作为实例,另外泛微,致远,蓝凌,纷享销客,携客云,数夫之类的软件客户端开发方式都不一样,总的来说,客户端开发,需要配合服务端,服务端接口有什么要求,就要按服务端的方式去进行,希望大家早日掌握接口开发精髓