** 1 安全认证方式:token **
一般第三方基于 restful 的 api 接口都有个登录的设计,也就是在发起正式的请求之前先通过一个登录的请求接口,申请一个叫做 token 的东西。
申请成功后,后面其他的支付请求都要带上这个token,服务端通过这个 token 验证请求的合法性。这个 token 通常都有一个有效期,一般就是几个小时。
** 2 要求对方提供:接口地址、接口示例、以及获取token所需参数(如使用token的话)。 **
以汇税通接口为例
**① token相关**
**② 正式请求**
** 3 程序开发 **
**① 获取token**
①-1 * 设置TOKEN地址
LV_URL = GS_URL-TOKEN_URL."此处地址可通过配置表维护并获取
①-2 * 创建token的http连接
CALL METHOD CL_HTTP_CLIENT=>CREATE_BY_URLEXPORTING
URL = LV_URL
IMPORTING
CLIENT = LO_HTTP_CLIENT_TOKEN
EXCEPTIONS
ARGUMENT_NOT_FOUND = 1
PLUGIN_NOT_ACTIVE = 2
INTERNAL_ERROR = 3
OTHERS = 4.
IF SY-SUBRC <> 0\.MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO WITH
SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
EXIT .
ENDIF.① -3 * 设置获取token的参数,此处参数由对方系统提供
①-4 * 设置请求方式 --根据第三方系统要求来
LO_HTTP_CLIENT_TOKEN->REQUEST->SET_METHOD( 'POST' ).
①-5 * 请求发送
LO_HTTP_CLIENT_TOKEN->SEND(
EXCEPTIONS
HTTP_COMMUNICATION_FAILURE = 1
HTTP_INVALID_STATE = 2
HTTP_PROCESSING_FAILED = 3
HTTP_INVALID_TIMEOUT = 4
OTHERS = 5 ).
①-6 * 获取返回值
LO_HTTP_CLIENT_TOKEN->RECEIVE(
EXCEPTIONS
HTTP_COMMUNICATION_FAILURE = 1
HTTP_INVALID_STATE = 2
HTTP_PROCESSING_FAILED = 3
OTHERS = 4 ).
①-7 * JSON转ABAP 反序列化拿到返回结构
CALL METHOD /UI2/CL_JSON=>DESERIALIZEEXPORTING
JSON = LV_RESPONSE
CHANGING
DATA = LS_TOKEN. "
• 拿到token
GV_TOKEN = LS_TOKEN-ACCESS_TOKEN.
①-8 * 关闭http连接 -- 此步很重要,尤其对于程序内存在多次调用时。因sap服务器http最大连接数有限制,超出就会dump。
LO_HTTP_CLIENT_TOKEN->CLOSE( ).
**② 成功获取token后,调用正式请求地址** 其http总体调用框架跟token一致,不同点在于请求发送之前多出一步body的设置
②-1 维护字段映射关系
BEGIN OF TY_NAME_MAPPING,
ABAP TYPE ABAP_COMPNAME,
JSON TYPE STRING,
END OF TY_NAME_MAPPING ,GTT_NAME_MAPPINGS TYPE HASHED TABLE OF TY_NAME_MAPPING WITH
UNIQUE KEY ABAP,
GT_MAPPING TYPE GTT_NAME_MAPPINGS.
②-2 * 维护当前接口所需body部分字段值,将编辑好的数据内表LT_PAYLOAD转换成符合示例要求的json字符串
LV_BODY = /UI2/CL_JSON=>SERIALIZE( DATA = LT_PAYLOAD NAME_MAPPINGS =
GT_MAPPING COMPRESS = '' PRETTY_NAME = /UI2/CL_JSON=>PRETTY_MODE-NONE
NUMC_AS_STRING = 'X').
②-3 具体调用过程和token类似,以下为区别点
正式调用参数设置
LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD(
EXPORTING
NAME = 'Authorization'
VALUE = GV_TOKEN ).
LO_HTTP_CLIENT->REQUEST->SET_CONTENT_TYPE(
EXPORTING
CONTENT_TYPE = 'application/json' ).
在请求发送之前维护BODY数据
LV_LEN = STRLEN( LV_BODY ).
CALL METHOD LO_HTTP_CLIENT->REQUEST->SET_CDATAEXPORTING
DATA = LV_BODY
OFFSET = 0
LENGTH = LV_LEN.
作者:孔 倩
审核:郑 浩
编辑:王 锐