T100客户端接口开发实例(T100对接销售易CRM)

2023-11-10

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作为实例,另外泛微,致远,蓝凌,纷享销客,携客云,数夫之类的软件客户端开发方式都不一样,总的来说,客户端开发,需要配合服务端,服务端接口有什么要求,就要按服务端的方式去进行,希望大家早日掌握接口开发精髓

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

T100客户端接口开发实例(T100对接销售易CRM) 的相关文章

随机推荐

  • Kotlin协程视频教程,极简入门与解密

    Kotlin协程极简入门与解密视频教程已经发布到CSDN学院 https edu csdn net course detail 31728 Kotlin作为目前最为流行的编程语言之一 学Kotlin的同学们都被Kotlin的简洁的语法和它强
  • oracle replace怎么用,oracle replace()函数用法

    用法介绍 REPLACE char search string replacement string char 等待替换的字符串 search string 搜索需要替换的字符串 replacement string 替换字符串 如果rep
  • XGboost进行时间序列预测

    文章最前 我是Octopus 这个名字来源于我的中文名 章鱼 我热爱编程 热爱算法 热爱开源 所有源码在我的个人github 这博客是记录我学习的点点滴滴 如果您对 Python Java AI 算法有兴趣 可以关注我的动态 一起学习 共同
  • 跳出弹窗页面禁止滚动(PC端和手机端)

    pc端如何实现 1 当弹窗显示时 为body元素添加属性 overflow hidden 当关闭弹窗时移除该属性即可2 在弹窗的div上设置 scroll stop prevent div 你要显示的内容 div 3 出现弹窗时 为body
  • 移动应用开发---uni-app框架

    目录 一 什么是uni app 二 环境搭建 三 uni app的构造 四 uni app框架主要有五大优势 五 运行项目 六 发布小程序 发布为微信小程序 发布为支付宝小程序 一 什么是uni app uni app 是一个使用 Vue
  • 数据库查询的基本运算,关系代数

    1 关系属性的指定 投影运算 这个操作是对一个关系进行垂直分割 消去某些列 并重新安排列的顺序 为投影运算符 表示按照i1 i2 in的顺序从关系R中取出n列 并删除结果中的重复元组 组成一个新的以i1 i2 in为列顺序的n元关系 2 关
  • doker部署postgres

    doker部署postgres 参考该博文 1 安装docker sudo apt get update sudo apt get install docker 2 在docker里面安装postgres镜像 docker pull pos
  • 第14.9节 Python中使用urllib.request+BeautifulSoup获取url访问的基本信息

    利用urllib request读取url文档的内容并使用BeautifulSoup解析后 可以通过一些基本的BeautifulSoup对象输出html文档的基本信息 以博文 第14 6节 使用Python urllib request模拟
  • c++11/14之std::shared_ptr作为引用参数,普通参数

    1 c 中使用std shared ptr类型做为构造函数参数 并使用std move 初始化成员变量 使用std shared ptr类型作为形参 shared ptr会被复制 使用std move 之后 形参对象就没有内容了 inclu
  • java根据生日计算年龄工具类

    在开发中时常遇到要通过生日计算年龄的需求 这里记录一下 private static int getAgeByBirth Date birthday int age 0 try Calendar now Calendar getInstan
  • linux强制卸载mysql报错

    error Failed dependencies mysql community client x86 64 gt 8 0 11 is needed by installed mysql community server 8 0 31 1
  • html在线校验器,HTML validate HTML验证

    HTML validate是指HTML验证 它是通过与标准HTML规则进行比较的方式 分析HTML文档 标记出错误和非标准代码的处理过程 Web页面使用HTML进行渲染 而HTML本身采用了HTML规范作为其规则和标准 通过验证HTML代码
  • 驱动开发 作业 day9 9/20

    基于platform实现 head h ifndef HEAD H define HEAD H 构建LED开关的功能码 不添加ioctl第三个参数 define LED ON IO l 1 define LED OFF IO l 0 end
  • 同时安装cuda8和cuda9

    转载自 https blog csdn net lovebyz article details 80704800 为了使用tensorflow目标检测API的所有算法 所以打算升级一下CUDA版本以支持tf gpu 1 5 但原本项目都是基
  • HTML5 canvas标签-1 基本使用

    终于有空使用csdn和大家分享点自己平时学习工作时候的心德啦 第一步 介绍下canvas的基本使用 首先 因为canvas是html5的一个标签 所以保险起见 可以先确认下canvas是否兼容 try document createElem
  • VISIO中的工具栏、菜单栏丢失的原因及解决办法

    症状 在 Microsoft Visio 中 您可能会遇到一个或多个以下症状 您所了解的工具栏是启用是不可见的 找不到菜单栏 按钮从工具栏中消失了
  • k8s搭建部署3个节点服务器

    目录 一 环境准备 二 安装kubeadm kubelet和kubectl 三 部署kubernetes Master 四 node节点加入集群 五 查看集群的状态 Init ImagePullBackOff错误 swap分区没有关闭 没有
  • 华为OD机试真题2023(JavaScript)

    华为机试题库已于5月10号由2022Q4 A卷 切换 为2023 B卷 B卷区地址 华为OD机试真题2023 B卷 JS 华为机试有三道题目 第一道和第二道属于简单或中等题 分值为100分 第三道为中等或困难题 分值为200分 总分为400
  • matlab 平方差,第七章 最小平方差的方法(The Method of Least Square ).doc

    第七章 最小平方差的方法 The Method of Least Square doc 第七章 最小平方差的方法 The Method of Least Square 本章說明利用最小平方差法 找出適合一組資料的曲線 在本章中包含Matla
  • T100客户端接口开发实例(T100对接销售易CRM)

    design bu leezec 296066606 应用实例 T100销售订单推送到CRM 需求分解 1 调用销售易接口校验取得token 2 取得token后按照要求推送数据 1 什么是token 首先 要调用CRM的实际应用场景 就绕