REPORT Z_COMMON_SEND_TO_WECHAT.types: BEGIN OF ty_kv, errcode TYPE i, errmsg TYPE string, access_token TYPE string, expires_in TYPE i, END OF ty_kv, BEGIN OF ty_senddata, touser TYPE string, toparty TYPE string, totag TYPE string, msgtype TYPE string, agentid TYPE i, BEGIN OF text , content TYPE string, END OF text , safe TYPE i,* enable_id_trans TYPE i,* enable_duplicate_check TYPE i,* duplicate_check_interval TYPE i, END OF ty_senddata , BEGIN OF ty_sendresult, errcode TYPE i, errmsg TYPE string, invaliduser TYPE string, invalidparty TYPE string, invalidtag TYPE string, END OF ty_sendresult .data:corpid TYPE string, corpsecret TYPE string, access_token TYPE string, ev_json_output TYPE string, ev_url TYPE string, ev_json_input TYPE string, ev_method TYPE string.DATA: ls_sendresult TYPE ty_sendresult, ls_senddata TYPE ty_senddata, lt_senddata TYPE TABLE OF ty_senddata, ls_access_token TYPE zaccess_token.DATA: time_now type tzntstmpl , time_old type tzntstmpl, secs type tzntstmpl, gettoken_flag(1).gettoken_flag = 1 .SELECT SINGLE * INTO ls_access_token FROM zaccess_token.IF sy-subrc = 0 . access_token = ls_access_token-access_token.get time stamp field time_now.PERFORM get_time(ZREPORT_FORM) USING time_now ls_access_token-TSTMP CHANGING secs .IF secs < ls_access_token-EXPIRES_IN. gettoken_flag = 0 .ENDIF.ENDIF.IF gettoken_flag = 1. PERFORM get_new_access_token. "access_token获取ENDIF.PERFORM send_message.WRITE: / ls_sendresult-errcode ,/,ls_sendresult-errmsg ,/,ls_sendresult-invaliduser ."发送应用消息FORM send_message. ev_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' && access_token. ev_method = 'POST'. ls_senddata-touser = '1670'."企业微信接收消息账号ID "ls_senddata-toparty "ls_senddata-totag ls_senddata-msgtype = 'text'. ls_senddata-agentid = 1000041."企业微信发送消息应用ID ls_senddata-text-content = '12345上山打老虎'. ls_senddata-safe = 1.* ls_senddata-enable_id_trans = 0.* ls_senddata-enable_duplicate_check = 0.* ls_senddata-duplicate_check_interval = 1800. " append ls_senddata to lt_senddata.ev_json_input = /ui2/cl_json=>serialize( data = ls_senddata compress = abap_true pretty_name = /ui2/cl_json=>pretty_mode-camel_case ). "将字符串中的[]替换REPLACE ALL OCCURRENCES OF '[' IN ev_json_input WITH space.REPLACE ALL OCCURRENCES OF ']' IN ev_json_input WITH space.PERFORM httpjson(ZREPORT_FORM) USING ev_url ev_json_input ev_method changing ev_json_output./ui2/cl_json=>deserialize( exporting json = ev_json_output changing data = ls_sendresult ).ENDFORM.PROGRAM ZREPORT_FORM.TYPES: BEGIN OF ty_kv, errcode TYPE i, errmsg TYPE string, access_token TYPE string, expires_in TYPE i, END OF ty_kv.*记录程序运行时间到日志表FORM REPORTLOG USING V_TCODE V_PROGNAME. TABLES:ZREPORTLOG .DATA: BEGIN OF LS_ZREPORTLOG OCCURS 100. INCLUDE STRUCTURE ZREPORTLOG .DATA: END OF LS_ZREPORTLOG.LS_ZREPORTLOG-PROGNAME = V_PROGNAME.LS_ZREPORTLOG-TCODE = V_TCODE.LS_ZREPORTLOG-UNAME = SY-UNAME.LS_ZREPORTLOG-BEGINDATUM = SY-DATUM.LS_ZREPORTLOG-BEGINUZEIT = SY-UZEIT.SELECT * FROM ZREPORTLOG WHERE PROGNAME = LS_ZREPORTLOG-PROGNAME AND TCODE = LS_ZREPORTLOG-TCODE AND UNAME = LS_ZREPORTLOG-UNAME AND BEGINDATUM = LS_ZREPORTLOG-BEGINDATUM AND BEGINUZEIT = LS_ZREPORTLOG-BEGINUZEIT.ENDSELECT. IF SY-SUBRC <> 0. INSERT INTO ZREPORTLOG VALUES LS_ZREPORTLOG. ENDIF.ENDFORM."httpjson接口FORM httpjson USING lv_url TYPE string li_json TYPE string li_method TYPE string changing lo_json TYPE string. DATA: lo_http_client TYPE REF TO if_http_client, lv_len TYPE i , ls_zhttpjson TYPE zhttpjson, lv_callid TYPE i. "创建客户端请求 CALL METHOD cl_http_client=>create_by_url EXPORTING url = lv_url IMPORTING client = lo_http_client EXCEPTIONS argument_not_found = 1 plugin_not_active = 2 internal_error = 3 OTHERS = 4. IF sy-subrc <> 0. "lv_subrc = sy-subrc.* MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH* sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. EXIT. ENDIF. "设定传输请求内容格式以及编码格式 lo_http_client->request->set_content_type( content_type = 'application/json; charset=utf-8' ). "设定调用服务 lo_http_client->request->set_method( if_http_request=>co_request_method_get ). "设置待传输内容长度 lv_len = strlen( li_json ). "设置调用方法 CALL METHOD lo_http_client->request->set_header_field EXPORTING name = '~request_method' value = li_method."'GET'. "设置传入字符串 CALL METHOD lo_http_client->request->set_cdata EXPORTING data = li_json offset = 0 length = lv_len. "发送数据 lo_http_client->send( EXCEPTIONS http_communication_failure = 1 http_invalid_state = 2 ). "接收返回 lo_http_client->receive( EXCEPTIONS http_communication_failure = 1 http_invalid_state = 2 http_processing_failed = 3 ). "提取返回字符串 lo_json = lo_http_client->response->get_cdata( ). "将字符串中的回车符替换,否则abap将会识别为# REPLACE ALL OCCURRENCES OF REGEX '\n' IN lo_json WITH space. "将本次调用进行记录 select max( callid ) into lv_callid FROM ZHTTPJSON . IF sy-subrc = 0. lv_callid = lv_callid + 1. ELSE. lv_callid = 1. ENDIF. ls_zhttpjson-CALLID = lv_callid . ls_zhttpjson-URL = lv_url. ls_zhttpjson-METHOD = li_method. ls_zhttpjson-I_JSON = li_json. ls_zhttpjson-O_JSON = lo_json. ls_zhttpjson-DATUM = sy-DATUM. ls_zhttpjson-UZEIT = sy-UZEIT. ls_zhttpjson-UNAME = sy-UNAME. INSERT INTO ZHTTPJSON VALUES ls_zhttpjson. lo_http_client->close( ). ENDFORM."获取两个时间戳之间的时间差(秒)FORM get_time USING tstmp1 type tzntstmpl tstmp2 type tzntstmpl CHANGING secs type tzntstmpl.try.secs = cl_abap_tstmp=>subtract(tstmp1 = tstmp1tstmp2 = tstmp2).catch cx_parameter_invalid_range .catch cx_parameter_invalid_type .endtry.ENDFORM."获取access_tokenFORM get_new_access_token CHANGING ls_kv TYPE ty_kv.data:corpid TYPE string, corpsecret TYPE string, ev_url TYPE string, ev_json_input TYPE string, ev_json_output TYPE string, ev_method TYPE string, time_now type tzntstmpl, ls_access_token TYPE zaccess_token.CORPID = 'CORP_ID'. " 微信企业号提供的CORP_IDCORPSECRET = 'CORP_SECRET'. "微信企业号提供的CORP_SECRETev_url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=' && CORPID && '&corpsecret=' && CORPSECRET.ev_method = 'GET'.get time stamp field time_now.PERFORM httpjson(ZREPORT_FORM) USING ev_url ev_json_input ev_method changing ev_json_output./ui2/cl_json=>deserialize( exporting json = ev_json_output changing data = ls_kv ).IF ls_kv-errcode = 0 AND ls_kv-access_token IS NOT INITIAL. SELECT SINGLE * INTO ls_access_token FROM zaccess_token WHERE access_token = ls_kv-access_token. IF sy-subrc <> 0 . ls_access_token-ACCESS_TOKEN = ls_kv-access_token. ls_access_token-EXPIRES_IN = ls_kv-EXPIRES_IN. ls_access_token-TSTMP = time_now. insert zaccess_token FROM ls_access_token. ENDIF.ENDIF.ENDFORM.
wsdl接口调用请求消息xml_SAP调用企业微信接口发送消息
最新推荐文章于 2022-12-30 10:26:38 发布