Tplogin用户登录及授权接口(XML)

概述

文档已经迁移到新网站,此文档不再更新和维护,外部商户不需要手机号字段的请移步 Tplogin(Xml)登录授权-行外,内部商户或者需要手机号的外部商户请移步 Tplogin(Xml)登录授权-行内  ,目前我们也提供了Tplogin的json返回报文格式(需要重新申请json版本的商户号) 请移步 Tplogin(Json)登录授权接口-通用


手机银行开放了用户登录和认证接口,通过该接口可以进行客户核身,并获取部分客户信息。根据商户类型的不同,分为内部商户接口和外部商户接口,前者可获取更多的客户信息。因为接口返回的信息可能包含客户敏感信息,所以对于接口的选择,有以下要求:

1.由分行信息技术部自行开发,并且部署在行内服务器(含招银云创的服务器)上的应用,方可使用内部商户接口;

2.由合作商户开发(或者由分行请外包团队开发)的应用,或者部署在行外服务器上的应用,只允许使用外部商户接口。

*注:内部商户外部商户在对接流程上完全一致,区别在于内外部商户能够获取的客户信息有差别,具体见附录。


名词解释

1.1商户

对第三方应用的统称,包括分行应用、外部合作公司应用、非手机银行平台的内部应用。

1.2联合登录

招商银行APP登录后将令牌发送给第三方应用,第三方应用通过解析令牌即可获得用户相关信息,这一过程称为联合登录。联合登录将手机银行用户体系开放给第三方,使得在第三方应用中无需执行登录即可获得用户信息。

1.3授权

第三方应用想要通过联合登录获取用户信息需要经过手机银行侧授权:即先要在线下通过商户管理员申请商户号、密钥等信息,并在线上发起联合登录请求时通过参数带入的方式传入商户号等信息,手机银行校验通过后方才将令牌发送给第三方应用。

1.4令牌

手机银行登录成功后将用户信息加密并签名后通过Http请求(POST方式)发送给第三方应用,加密后的用户信息称为令牌。

1.5签名与验签

手机银行发送给第三方应用的加密数据中包含了一段签名数据,它经过手机银行私钥加密产生,第三方应用需在拿到密文数据并解密后,对签名数据进行验签,即使用手机银行公钥匹配验证,防止数据被篡改。详见“安全控制”章节。


交互流程

参数说明

3.1传入参数

第三方应用前端js通过调用tplogin接口唤起手机银行APP登录,请求示例如(以华彩证券为例):location.href=”tplogins://www.huacai.cn/iphone_buy.do?param=xxxxx&corpno=123123&auth=6c1c600b27347c220a076b41c064ca6b”,可将此段js代码置于页面加载事件中。

参数名参数释义备注
tplogin(s)唤起登录指令,若商户回调url使用http协议则为tplogin,若商户回调url使用https协议则为tplogins
param商户希望招商银行侧透传的参数(需要进行urlencode处理),可有可无
corpno商户号,由招商银行侧分配
auth授权信息,商户侧对请求内容与corpkey拼接后进行MD5得到的字符串
corpkey商户密钥(原KEY),由招商银行侧分配

登录唤起示例代码,Jquery为例:

$(document).ready(function(){
    location.href=”tplogins://www.huacai.cn/iphone_buy.do?param=xxxxx&corpno=123123&auth=6c1c600b27347c220a076b41c064ca6b”;
});

auth计算示例伪代码(注意:tplogins链接需全部小写,包括corpkey):

auth=MD5(strtolower(tplogins://www.huacai.cn/iphone_buy.do?param=xxx&corpno=123123+corpkey)));//+号仅代表连接符,实际代码中无此符号
3.2传出参数

手机银行完成登录后通过发起回调url请求(POST方式),将加密后的用户授权信息发送至第三方应用,如:https://cmbchina.huacai.cn/iphone_buy.do?param=xxxxx

参数名参数释义备注
param如上,商户希望招商银行侧透传的参数,GET方式
sResponseXml

通过POST方式返回应答报文,xml格式,如:

<Response>

   <Head>

       <ResultType>Y</ResultType>

       <CryptType>2</CryptType>

   </Head>

   <Body>

       <--!UserDataBase64-->

       /qigtuR2GX2aR5z+z329BCDH8q7cpRdOe9fMJBW7Emob9=

   </Body>

</Response>

a.ResultType即登录结果:Y表示成功,N表示失败,成功时body中放置加密密文,失败时放置失败原因(明文);
b.CrypeType即Body加密类型:1表示明文,2表示DES加密,3表示非对称加密;
UserDataBase64用户授权信息,以密文形式展示,第三方应用需先Base64解码并进行DES解密后方能看到明文数据。用户信息均以XML格式返回,不同商户拿到的信息会有不同。


第三方应用在进行DES解密用户授权信息时,关于DES算法一些参数指定如下:

●密钥:即corpkey(开发联调环境统一使用“cmbtest1”,生产环境需上线前申请);

●解密模式:ECB;

●填充模式:PKCS5Padding(Java)/PKCS7Padding(C#);

●编码字符集:UTF-8;

当解密完成时,第三方应用会看到如下xml格式的用户明文数据,具体信息视第三方应用需求场景而分配,详细信息字段名及释义见附录1。

<Param>
   <Head>
          <!—签名类型:1明文,2 对称加密,3 非对称加密-->
          <Type>3</Type>
   </Head>
   <Body>
        <Data>
            <!--卡列表信息-->
            <CardNoList></CardNoList>
            <!—商户信息-->
            <CorpInfo></CorpInfo>
            <!—客户信息-->
            <CustomerInfo></CustomerInfo>
            <!—登录信息-->
            <LoginUserInfo></LoginUserInfo>
        </Data>
   </Body>
   <Tail>
        <!—签名信息-->
        <Verify></Verify>
   </Tail>
</Param>

DES解密示例伪代码:

//密文数据Base64转码
userdata = base64decoder.decode(UserDataBase64);
//获取密钥byte数组
key = corpkey.getbyte(“UTF-8”);
//设置des解密模式
desdecrypter.mode = ECB;
//设置des填充模式(Java为PKCS5,.NET为PKCS7)
desdecrypter.padding = PKCS5;
//des解密得到明文数据
decryptdata = desdecrypter.decrypt(userdata, key);

安全控制

招商银行保证提供给第三方的授权令牌信息是合法有效的,但第三方必须采取以下措施,以避免开放环境下的信息安全风险。

4.1安全协议

第三方应用应支持https安全协议。

4.2加解密

用户信息采用DES对称加密,密钥由手机银行签发,(联调测试环境统一用“cmbtest1”,生产环境需上线前申请),第三方应用应妥善保管,避免泄露;第三方应用应禁止在前端解密用户信息,严禁以明文方式在前端展示或缓存用户敏感信息,在解密得到用户信息后必须以安全方式传输。

4.3签名验证

手机银行签发的令牌附有数字签名,为确保授权信息的合法有效性,第三方应用必须调用招商银行提供的验签API(jar或dll)以及公钥来验证签名。具体做法是,将用户信息中的Param/Body节点内容与Param/Verify节点内容拼接,格式为“Body内容&signature=Verify内容”,把拼接内容与公钥一起传入验签API进行验证,得到验签结果。需要特别注意的是,若<Body>后紧接着不是<Data>节点且用户信息不含中文,则直接用Body内容进行拼接后验签,否则均需先对Body内容进行Base64转码后,再拼接进行验签。相关接口及公钥参见附录2“手机银行登录授权API验签工具包.zip”。

另外,令牌中包含有时间戳,第三方应用应验证令牌时间戳,控制到一个合理范围(一般10-30分钟),如超出则当前令牌失效,提示用户重新登录。

签名验证调用示例源代码(注意,此处为验签调用方式为可复用的源代码):

//首先保证已导入验签API,Java已导入jar包,C#已导入dll(将dll拷至bin目录)
//参数说明:
//signdata为拼接内容即signdata=strBody(Base64转码后)+”&signature=”+strVerify;
//publickeypath为公钥存放的物理路径
//---------Java调用验签示例(需引入命名空间cmb.netpayment.* )------------
import cmb.netpayment.*;
public static boolean VerifySignature(signdata, publickeypath){
    Security verifier = new Security(publickeypath);
    return verifyer.checkInfoFromBank(signdata.getBytes(Encoder.UTF_8));//成功时返回true
}
//---------C#调用验签示例(需在验签方法前声明外部函数)------------
[DllImport("FirmClient.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern int CheckInfoFromBank(string sPublicPath, string sBody);
public static int VerifySignature(signdata, publickeypath){
    return CheckInfoFromBank(publickeypath,signdata);//成功时返回0
}


用户授权申请

招商银行APP版本7.3.0及以上,针对要获取敏感信息的外部商户将增加用户授权申请环节,行内商户无需处理。

5.1 用户授权申请页面

(备注:授权申请页中间的权限描述根据商户权限不同而不同)

5.2 用户授权申请点击

以外部商户获取手机号为例(手机号为敏感数据):

(1)用户A,第一次触发tplogin

①用户点击“同意”

令牌包含敏感数据,即包含手机号。

②用户点击“拒绝”

令牌不包含敏感数据,即不包含手机号,并且在令牌解密后的明文<head>中新增子字段<UserAttitude>0</UserAttitude>

(2)用户A,第n(n>1)次触发tplogin

不再出现授权申请页面,沿用第一次用户A的选择,即第一次选择“同意”,之后tplogin请求获取的令牌均包含敏感数据;第一次选择“拒绝”,之后tplogin请求获取的令牌均不包含敏感数据。

5.3 商户再次向用户申请授权

若是商户需要再次向用户A申请授权,需在tplogin请求中携带参数snt=Y,如:

tplogins://www.huacai.cn/iphone_buy.do?param=xxxxx&corpno=123123&auth=6c1c600b27347c220a076b41c064ca6b&snt=Y

将再次出现授权申请页面。


小程序URL带上CorpTrackingID参数

为了便于总行统计小程序的访问量,请各分行(或小程序商户)在小程序的页面(包括该小程序的所有子页面)的URL后面加上一个参数:CorpTrackingID,参数值为P+小程序商户号;例如,某小程序的应用地址为:https://sz.cloud.cmbchina.com/abc/login.html,小程序商户号为003001,那么需要在该的小程序页面(包括子页面)地址后面加上参数,变为:https://sz.cloud.cmbchina.com/abc/login.html? CorpTrackingID=P003001

备注:该统计仅用于首页推荐的权重计算,暂不支持输出具体的PV和UV数据给分行;不需要出现在首页十宫格内的小程序,可以不用加这个参数;

测试客户端下载、申请测试环境小程序商户号


测试说明分行(或合作商户)在开发和测试阶段,若需要进行接口的联调和测试,可通过测试客户端连接到我行的测试环境。请按以下步骤进行(各个步骤的详细内容在下文中将有详述):
1、申请测试环境的商户号、申请配置测试入口;
2、安装测试客户端,并连接所需的环境;
3、在测试客户端内找到测试入口,进行联调和测试;
申请测试商户号/测试入口

发邮件给ben_chan@cmbchina.com,抄送给lilizao@cmbchina.com


邮件需要提供以下信息:

商户类型(行内/行外)

测试用的小程序URL地址

小程序名称

页面顶部是否需要使用手机银行默认的导航栏(是/否)

该小程序是否需要使用一网通支付(是/否)


我行人员完成配置后,会回复邮件,邮件包含:测试安装包下载地址、测试商户号、测试入口在测试客户端内的位置、测试秘钥;

测试环境说明

打开测试客户端,会弹框提示选择需要连接的测试环境,请根据自己的实际情况进行选择;


行外使用(DMZ
121.15.180.72,端口号:80


行内使用
99.12.73.80,端口号:888(不需要使用一网通支付)
99.12.69.80,端口号:80或802(需要用到一网通支付)

测试商户号/密钥测试商户号以邮件反馈的为准,测试秘钥统一使用cmbtest1
测试用一网通账号/银行卡号

银行卡号:6225886551249897,登录密码:774411
一网通账户(登录密码均为774411)
18943444960
13840831542

15835605832

一网通非实名账户

17577441100(密码:77441100)

测试安装包下载地址

测试安装包下载请点击这里


测试客户端使用方法安装后,会弹框提示,请选择需要连接的环境(请确认host和端口号与申请的是否一致)

申请正式环境小程序商户号申请

在小程序正式上线前,需要提前向总行申请生产环境正式的商户号和秘钥等配置信息。从手机银行7.0版本开始,小程序可以纳入手机银行APP首页的十宫格推荐算法,希望纳入推荐算法的小程序,需要单独申请一个商户号,不可与其他小程序共用。关于商户号共用的问题,具体请看这里:多个小程序可否共用一个商户号和秘钥?

由于手机银行侧配置发布采取灰度策略,每个版本发布需要经历约一周时间,因此请在自身应用上线前(或营销推广前)至少提前2周向总行发起参数上线申请,如果上线时间紧迫,可以无需等到应用开发完成,提前申请商户号和秘钥。

申请方式为:由分行的业务部门或分行信息技术部的相关同事(如果是外部商户,须由商户拓展分行发送邮件)发邮件给招商银行小程序管理/80266529(邮箱:xiaochengxu@cmbchina.com),并抄送给发件人的主管和李立早/01149824、郑璇/224899,邮件标题为:xx分行申请小程序商户号和秘钥,并在邮件内填写如下表格,表格内有填表说明;

小程序商户号申请表(模板&填表说明)_20181218.xls


注:如对上表有疑问可直接咨询总行李立早/01149824。

附录1.内部商户授权信息字典


参数名

参数释义

备注

卡列表信息(CardNoList节点内容)

请注意:目前招商银行App同时支持“招行一网通”和“招行卡号”这两种方式登录,在这两种登录方式下,卡列表信息所包含的内容有所不同。

若客户是用一网通账号登录,“卡列表信息”为一网通所绑定的所有银行卡信息;

若客户是用招商银行卡号登录,“卡列表信息”则只包含这张卡片的信息;

CardNoType

账户类型

01:本行借记卡
02
:本行信用卡
11
:他行借记卡
12
:他行信用卡
99
:一网通账户

CardNo

卡号(一卡通)或账户号(信用卡)


CustomerID

核心客户号


MobileNo

手机号码


DefaultCardFlag

默认卡标识


BankName

所属银行

如:招商银行

AcctBranch

一级分行号

如:0755

AccountLevel

账户等级(I类户、II类户等)

V0:I类户(掌上生活开户的电子一卡通) V1:I类户 V2:II类户 V3:III类户 F0:一卡通附属卡 空:未知/信用卡

商户信息(CorpInfo节点内容)

CorpName

商户名称


CorpNo

商户号


AppName

APP名称


AppVersion

APP版本号


NewUserID

用户ID,由身份证+姓名+商户号加密后生成

逐渐废弃,不建议使用

UniqueUserID

实名用户身份标识,由身份证+姓名加密后生成

(推荐使用)

UniqueUserID的用户为实名用户


ExpandUserID

一网通用户身份标识,由一网通ID加密后生成

ExpandUserID为一网通用户的身份标识,若返回信息中此ID不为空则代表当前用户是通过一网通账号登录手机银行。

请注意,通过返回结果中是否包含UniqueUserID或ExpandUserID,可以判断当前用户的登录方式以及是否为实名用户,具体如下:

1、若该用户只有UniqueUserID,无ExpandUserID,则说明该用户是通过招商卡号登录手机银行;

2、若该用户只有ExpandUserID,无UniqueUserID,则说明该用户是通过一网通登录手机银行,且其一网通账号未进行过实名认证,即“一网通非实名用户”

3.若该用户同时有UniqueUserIDExpandUserID,则说明该用户是通过一网通账号登录手机银行,且该账号已经进行过实名认证,即“一网通实名用户”。

TimeStamp

时间戳

12小时制,无am pm标志(历史遗留问题)

客户信息(CustomInfo节点内容)

RealName

客户姓名


IDType

证件类型

01-身份证,02-护照,03-其他

PersonalID

证件号码


Mobile2

银行预留手机号

优先取值为一卡通预留手机号,若取不到,则根据登录类型获取,即信用卡登录为信用卡预留手机号,一网通登录为一网通注册手机号

Level

客户等级

该客户所持有的招行卡中的最高卡等级(请注意:非一网通所绑定的卡片中的最高等级),如果无招行卡则为空。

LV1-普卡、LV2-金卡、LV3-金葵花、LV4-砖石卡、LV5-私人银行

登录信息(LoginInfo节点内容)

LoginType

登录类型

A-一卡通,C-信用卡,D-一网通

LoginID

登录ID

A-一卡通卡号,C-身份证号,D-一网通用户号

NetBankUserName

一网通登录名


AppID

设备ID


Version

客户端版本


ClientIP

客户端IP


NetBankMobile

一网通预留手机号


NetBankEMail

一网通注册邮箱


NetBankLoginName

一网通注册自定义用户名


备注:加粗部分为20181120后新增的字段,原有内部商户需要时请向李立早报备,新的内部商户均开放。


附录2.外部商户授权信息字典

参数名参数释义备注
CorpName商户名称
CorpNo商户号
AppName应用名称
AppVersion应用版本号
NewUserID用户ID,由身份证+姓名+商户号生成逐渐废弃,不建议使用
UniqueUserID

实名用户身份标识,由身份证+姓名加密后生成

(推荐使用)

UniqueUserID的用户为实名用户

ExpandUserID

一网通用户身份标识,由一网通ID加密后生成

ExpandUserID为一网通用户的身份标识,若返回信息中此ID不为空则代表当前用户是通过一网通账号登录手机银行。

请注意,目前招商银行App同时支持“招行一网通”和“招行卡号”这两种方式登录,通过返回结果中是否包含UniqueUserID或ExpandUserID,可以判断当前用户的登录方式,以及是否为实名用户,具体如下:

1、若该用户只有UniqueUserID,无ExpandUserID,则说明该用户是通过招商卡号登录手机银行;

2、若该用户只有ExpandUserID,无UniqueUserID,则说明该用户是通过一网通登录手机银行,且其一网通账号未进行过实名认证,即“一网通非实名用户”

3.若该用户同时有UniqueUserIDExpandUserID,则说明该用户是通过一网通账号登录手机银行,且该账号已经进行过实名认证,即“一网通实名用户”。

Timestamp时间戳24小时制

备注:外部商户若要获取手机号需总行和分行审批,在数字签名验证时采用内部商户的验签方式,即Body内容需先Base64

附录3.支持小组

1、总行业务联系人:李立早/01149824;

2、测试环境技术支持:夏裕元/HH04149;

3、疑难问题技术支持:张星/80230395;

4、手机银行登录授权API验签工具包下载:手机银行登录授权API验签工具包

FAQ

Q1:第三方商户地址未能通过校验,可能不是合法地址。

A1:发起tplogin或tplogins请求时,参数auth值计算错误。请检查商户秘钥是否正确,计算auth时md5算法及输入参数是否正确。

Q2:商户跳转失败:未能找到商户节点!

A2:服务端无此商户的配置,测试环境联系陈伟锋,生产环境需联系总行李立早提前2周申请。

Q3:Android:登录失败,请重新登录再试!(服务端正在更新,请稍后再试)

A3:服务端商户配置存在错误,可能是商户号被重复使用,测试环境请联系陈伟锋。

Q4:Android点击取消登录又唤起一次登录。

A4:请通过前端发起tplogins请求,使用window.location.href = “tplogins://…”;

Q5:内部商户DES解密后的明文中<Body>和<Data>之间出现特殊符号/uFEFF。

A5:文件编码问题,验签时需包含该特殊符号

Q6:DES解密失败。

A6:(1)检查获取到的SresponseXml是否+号被转义成空格了,请将空格替换回加号;
(2)sResponseXml需先base64解码再DES解密,utf-8编码格式。

Q7:数字验证签名失败。

A7:待验证参数 = “原文&signature=签名”
原文:DES解密结果中<Body>的内容(不含<Body>标签);
签名:DES解密结果中<Verify>的内容(不含< Verify >标签)。
例如原文为“this is a test”,签名为“123|456|789|”,那么参数就是“this is a test&signature=123|456|789|”。

(1)C#签名验证失败

验签API返回结果:

返回值描述
0验签成功
13public.key文件的路径错误
14待验证的数据拼接不正确

待验证的数据需注意以下事项:

1.内部商户和原文含中文的外部商户,需要原文进行Base64编码;原文不含中文的外部商户则不用;

2.内部商户验签的原文是<Data>的内容并包含<Data>标签。

(2)Java签名验证失败
返回值描述
true验签成功
false验签失败(1.public.key路径不正确,确保路径正确并且可以找到公钥文件 2.验签内容不正确

*注意:

① Java针对过长的字符串会进行自动换行,请注意把自动增加的换行符删掉,特别是原文base64时。

② 针对闭合节点如<CardNoList />,Java会将闭合节点中的空格去掉成<CardNoList/>,验签时需用<CardNoList />。


Q8:内部商户测试数据

<Response><Head><ResultType>Y</ResultType><CryptType>2</CryptType><StateType>1</StateType></Head><Body>/qigtuR2GX2aR5z+z329BFyxpv1AvK5ke9fMJBW7Emob9hG6xurMDiQW9AoTA2bgDS36z/8tRDYW8sFiT9Xlqj68BzRWBkDdDS36z/8tRDZGse05xCKGk+jcxb753wQTynDAW7cIM5JrelU9iRo4E5LkEpIuIYYt+fTeWp54iJyPXaWEw+rV97e+fodCjMNAADLlX6sZAirAJsje1n2jkgPBZMDqb3IB+w1QUiVKnOdPXcU2pA1Qo9qh/nk0C7CDVkHArQxBM4+lXFluPTMyiGb72a70QLZKlV6RvpES0owAXfbVz1NcdLECIV5KbuTFsBcOxBICXU1KBmYajJrl/y9fMmkUs/pHuujmawon3mOMLylpuKa6tZ/k6hFMbUOJeGqXHTCvEt3mpB5L7JDk4hC/5yn0GW79y43IXRnEiS+D/BC4FHiIw3G/62BSTnxPxA0Y6x53M8ULItyMRVIXX1YGT/N8WxDiOA1gD+cZWkL9MYYNO9l9cYT9EIWy+c20LyIZP5aBsFeVXpG+kRLSjABd9tXPU1x0ZvvZrvRAtkqAmJMmFm7ztBbJlWTDumvKCGxsvfl+tlANLfrP/y1ENkAbqW9bVseibE2O4XeXx+9t4oXjHiVEF49dpYTD6tX3t75+h0KMw0AAMuVfqxkCKsAmyN7WfaOSA8FkwOpvcgH7DVBSJUqc509dxTakDVCj2qH+eTQLsINWQcCtDEEzj6VcWW49MzKIessei3rEl2AS4IEJdhhJ7lasExQHRSQRG0vFRgoUjOqUUB2IYxIrg2yC0KkIjtOlfmT0JqcR4B2pCBuoxR2N/DL6GLw3NZk1v35fO1A7ktthyYWTbMcWwcfy2NFrKV7ygwGFVnuZmVoqUWr1cJKVydwquVR+s0Y35BVytmAHdVTf07lO00iV+tejAcYLIF0+mREZuo9zPPqBwe7qXLKq9Ayk0AGvFp5mTcokQ6KSOVk18/hyMtmvDVZ2WV3ZPvvcbeZq7MLF6S5g6WctzD78XIyTkzm7gx4y098femW8Kibak8eG6wvgtOnCed6GiADR5g+O7r4Agk+Kc4M/K2GkMXOgaIE2Gu6nKa7cAEO47OWzZ9pprOnP+OQXAkeq/KZTUDy2gTtVWWRu7H8RLbR0h3OI9pe7dljsFi14q1wWkwrQMjN/LHnCDv/5rddcjrBvaqddx8ujVqSl5NeqF54ZrMBrUjjqAAj70++71MOkQYrl9bctfnDMiYvIKx2EU1nenG+n7lOWAbQDKUKXKljjQ1g7hnaB+08C4ibvfT/vj2Gjw3zcKCRn9MuadragWd61BpoRdTeBG/+pd3sYSYN0uvQbo3lQl4ePne5eiCerrX9r+2xRGvQ2YIBjTsVfkpE4YiofJ2qDXIsrxvFh9qlCI3H6tLJUmkl2OWYDg55RXgF4oKoIHfNumXZatfCyIRhOK0a34Ok88NBd4mMbQfRkmeJ6PJZfCIRCwL+eLNPI/s8v/YWbI9vDexu/0CfXUX3P/6ic7zyQIwlMvD934rubm4ksfjUcXPUXYlLsge+U6zvkHOlm92xeZyuHbXy5hBCPMR43+SAfqR3/MklCZhb5hpJFQTY6XNrCCpN12jQ4DYeoZ7iuHMbiCb24M7dbiEFysTZCLYsBBcdbglnPd4Yi8hmcyAD0Tcbhn3c5tO2ggifQjrUmI41FhA5Raq6r9FlIzBKTKExrlxkykg9EIsPEt1rV1dpbZuF694przAy8aOFwZlTwcd5x/oIBoRHFe4+kJHb2X0zYD/J+Je2nd5wiPUSRrQV68+AePaq2x8QWIkPje8MhOXHTwzyL8x3Xti/Io+8bQorKXlQk6qX6qOfEeRu+R8sBWtzdJlkdgfDvEKdKuLiNR1c3XYIWVNqQzpOa8YTi7AhVUZgFGnx3xZ3usQ==</Body></Response>

上述标红部分(Body节点内内容)即用户授权信息,先经Base64解码后DES解密,若解密成功显示Xml明文结果如下,若解密失败首先考虑返回报文中“+”号被转义成了空格。

<Param><Head><Type>2</Type></Head><Body><Data><CardNoList><CardNoInfo><CardNoType>99</CardNoType><CardNo>6212760000062315</CardNo><MobileNo>13546789704</MobileNo><DefaultCardFlag>N</DefaultCardFlag></CardNoInfo><CardNoInfo><CardNoType>01</CardNoType><CardNo>6214837810550941</CardNo><CustomerID>7556863758</CustomerID><MobileNo>13546789704</MobileNo><DefaultCardFlag>N</DefaultCardFlag></CardNoInfo><CardNoInfo><CardNoType>11</CardNoType><CardNo>6222021202000123456</CardNo><MobileNo>13546789704</MobileNo><DefaultCardFlag>N</DefaultCardFlag></CardNoInfo></CardNoList><CorpInfo><CorpName>nbsh2</CorpName><CorpNo>123124</CorpNo><NewUserID>UIf4kxfwkpvbAO+FzxOsSL/ZYwAvU=</NewUserID><UniqueUserID>UQWd1ZrII7WKsKKGiQ4nAVatZEw6I=</UniqueUserID><TimeStamp>2018/01/30 05:41:41</TimeStamp></CorpInfo><CustomerInfo><RealName>三类户七</RealName><IDType>01</IDType><PersonalID>362321198809278794</PersonalID><Mobile2>13546789704</Mobile2></CustomerInfo><LoginUserInfo><LoginType>D</LoginType><LoginID>015200169313</LoginID><NetBankUserName>13546789704</NetBankUserName><AppID>000000010212017040554AAB5C6-A607-40B6-BAF3-FDD5C45DB9A20wYF5txs=</AppID></LoginUserInfo></Data></Body><Tail><Verify>173|160|111|162|33|68|44|30|237|213|173|70|66|100|88|46|46|92|76|215|21|41|20|83|178|81|255|10|16|240|38|161|252|43|56|130|60|111|113|19|162|95|137|43|66|2|123|78|51|21|223|187|224|14|185|59|35|154|102|69|139|235|14|45|</Verify></Tail></Param>

Q9:外部商户测试数据

(1)普通外部商户测试数据

<Response><Head><ResultType>Y</ResultType><CryptType>2</CryptType><StateType>1</StateType></Head><Body>/qigtuR2GX2aR5z+z329BCDH8q7cpRdOe9fMJBW7Emob9hG6xurMDuLqxv3jg8DRErFtYwTsJGRq1y3j2qFA2EFxFrlxgGdUMYuPOJrQTPD8go0ulrvPzQQCqHZouoc8TRAGvEJo299cvb2LxANZYfLKH/D1fCf/8Mj+ilH4XnNrTGWZelfZ9PzD/HiM7DFlYP5L5fuzLwQDGjWMd+uoy1ljatifeOyXm3biJPieitMpzZS4xE2XTpCgwpA522sXyYRkzRhta78x44ImE4wBbS4OE048ZbHNFyziDALH3ixfGkNGpuXweKRTIzgnvKp/qIAKAnfTfQGgl3yyC/qXCStyBUsx+8o1aKvMtfmKMRd2vKqtRtBNvljwtgAPGQPYR4hdTly3MCQ5O90AO98HvXi8g5BuHf16olAxcEW5cep7k1wewaYdPh2/x63I7oASCipfRxRlBkK2KZhS7B7Fm9ftm8Q4IMZrt2LGpiczTd66jCDUXITBLdggy6FOvNX2UBbmdE3QhSg5i48z+5YZtFdROmu7idtUAawmvOHfa3EZGXiBlQWfD9wxBF4dfJT754eh6hubA5ioLCCa18iSzCNuquJ+X/6JY2Z/HHhbBR5qggNHCBDfRLOGSa/Dk1aKegKg1NU/xuk1hazuL6Q4gJ1wv/S5beRcU/Yw/A6UqqPY0LKz3XonjDinFsIoLbeyPS57xUaKVH32wthg3NWmC74FkDR7nmQsKJBzyA8qAHk=</Body></Response>

上述标红部分(Body节点内内容)即用户授权信息,先经Base64解码后DES解密,若解密成功显示Xml明文结果如下,若解密失败首先考虑返回报文中“+”号被转义成了空格。

<Param><Head><Type>3</Type></Head><Body><CorpNo>001021</CorpNo><CorpName>huawei</CorpName><AppName></AppName><Version>9.0.0</Version><UserID>UAGgrqAQS2JGBGeAl/aA</UserID><IsQuickPay>Y</IsQuickPay><AccAgreeMap></AccAgreeMap><FuncNo></FuncNo><TimeStamp>2013-10-21 16:52:50</TimeStamp></Body><Tail><Verify>37|72|11|91|46|203|154|51|202|219|122|90|163|209|25|103|165|64|137|52|3|85|232|250|168|182|40|188|68|171|44|104|185|246|134|88|33|94|175|99|103|99|231|31|183|193|157|25|26|230|165|141|44|91|175|182|138|240|254|16|227|109|252|190|</Verify></Tail></Param>

(2)含手机号的外部商户测试数据

<Response><Head><ResultType>Y</ResultType><CryptType>2</CryptType><StateType>1</StateType></Head><Body>/qigtuR2GX2aR5z+z329BFyxpv1AvK5ke9fMJBW7Emob9hG6xurMDiQW9AoTA2bgIu6NZneBBcpvDT2rnn4vXig7e2fz1idxBBlrljmNJV6Fa0X0q1h+dd/arxFtEqdbB4gHixO1stG5l5WGDBZzMJR5dOC9dCN5lcSGEbJFSNb15kORokNdzbsncMc5OtDvzSZAr5FX/5CQJg/J7jslHwP0EnpKudb4xzyBkY+pS2SRGfb4bvM9dMhB+edCtUBDAsB/EPcQhpsemKXsse34egclqhi914iPRMaLtJHL06H0jI7am+kvxfSn7J2yNlm40FneCjMpjOmvZk8oUc3rB5RDiaWikSEgl6aDKpHvABaK18gT79fCGiCSnXPKr+33eGqXHTCvEt0GlV8wOfdlaSWMsV3tWc3+uDOLoqUVMxqJg6jDFY8fBcdlsFtnMLa7beYFOqlG/bTTHIq6sk2KGPnLAR4XlhJ9aGAfUnSL0vaYrKZtf+npZDb/Nzd7LCJA168vJvpJPHoUFTQTR3qU1cDCeXcUHTmLd25PS3cFc6BNCLBP6aO+QuiMzaD2UmAjKpWlZOcuzcqbWRJFq5jSmpRRHO3o19WV1cfsVUWVj8Juw+f7i8qt5AsrmT9hLvp6ZR/E3G5YWoiKZMXfS5HlQlqX7XrBapocDGM1d0N9wNaNONkjb3NlC8jdhe39PJn5hlM+Lr/RUYGkNDuzigA9wzDUO+i0Ee7pPXCyWFrCf222Ab3PR3LfEP6FYCkvUAumbTVFibIc3Ws=</Body></Response>

上述标红部分(Body节点内内容)即用户授权信息,先经Base64解码后DES解密,若解密成功显示Xml明文结果如下,若解密失败首先考虑返回报文中“+”号被转义成了空格。

<Param><Head><Type>2</Type></Head><Body><Data><CorpInfo><NewUserID>UI6iCjAnry6mufEOwRMU+4EhTFjnM=</NewUserID><UniqueUserID>UQ1XN8sm4hppa1iSjjmWXTBtEwogs=</UniqueUserID><ExpandUserID>EUjeIUXDBPm34mef9k4TVOVS62mV8=</ExpandUserID></CorpInfo><CustomerInfo><Mobile2>13600136000</Mobile2></CustomerInfo></Data></Body><Tail><Verify>56|75|136|50|8|72|15|200|11|163|45|123|7|151|91|22|140|226|69|169|100|113|92|151|49|248|55|65|245|248|100|49|54|253|245|195|110|45|48|65|180|223|162|41|217|190|95|125|123|58|104|216|151|123|246|218|32|21|61|112|129|237|31|84|</Verify></Tail></Param>

注意:含手机号的外部商户在验签时采用内部商户验签方法,即Body内容需base64之后才能拿来验签。

Q10:报错排查。

A10:

编号
(内部商户)报错信息报错原因
No.1[301]您的一网通用户需要先进行实名认证才能继续操作。该一网通用户未实名,可通过绑卡实名
No.2对不起,此功能正在维护中,暂停使用#I1。服务端配置有误,测试环境请联系陈伟锋处理,生产环境请联系支持小组。
No.3对不起,此功能正在维护中,暂停使用#I2。服务端系统异常,测试环境请联系陈伟锋处理,生产环境请联系支持小组。
No.4对不起,此功能正在维护中,暂停使用#I3。
No.5对不起,此功能正在维护中,暂停使用#I4。
No.6对不起,此功能正在维护中,暂停使用#I5。
No.7对不起,此功能正在维护中,暂停使用#IR。
No.8抱歉,系统正在维护#2......
No.9系统正在维护中#1



编号(外部商户)报错信息报错原因
No.1[301]您的一网通用户需要先进行实名认证才能继续操作。该一网通用户未实名,可通过绑卡实名
No.2对不起,此功能正在维护中,暂停使用#O1。服务端配置有误,测试环境请联系陈伟锋处理,生产环境请联系支持小组。
No.3对不起,此功能正在维护中,暂停使用#O2。服务端系统异常,测试环境请联系陈伟锋处理,生产环境请联系支持小组。
No.4对不起,此功能正在维护中,暂停使用#O3。
No.5对不起,此功能正在维护中,暂停使用#O4。
No.6对不起,此功能正在维护中,暂停使用#O5。
No.7对不起,此功能正在维护中,暂停使用#O6。
No.8对不起,此功能正在维护中,暂停使用#OR。
No.9系统正在维护中#1


Q11:多个小程序可否共用一个商户号和秘钥?

A11:每个小程序必须申请独立的商户号和秘钥,做到“一号一用”。多个小程序混用同一个商户号会导致数据统计不准确、无法使用短链接、无法通过算法推荐出现在首页宫格等问题。

Q12:调用了用户授权及登录接口,但是没有相关信息返回?

A12:网络问题,请参考http://99.12.136.169/index.php?s=/20&page_id=203中的“2.商户/小程序页面打不开”。

Q13:提示“商户跳转失败,商户号不能为空”?

A13:小程序发起请求时未传商户号。

Q14:ST环境可以登录验签成功,UAT环境不行?

A14:数字签名验证方法未覆盖所有场景,测试账号不同,授权数据也就不同,用于验签的Body内容也会不同。

Q15:外部商户获取手机号,怎么验签?

A15:此类商户采用内部商户验签方式,即需要先将Body进行Base64,再拼接进行验签。

Q16:手机银行已登录状态可以进入测试页面,未登录进入测试入口报405错误?

A16:登录授权接口要求小程序应用允许get和post两种请求,针对分行小程序应用部署在paas上的nginx容器里,其解决方案:在nginx.conf配置error_page 405 = $uri      error_page 405 = 200 $uri。

Q17:验签API中,Java导入的jar包如何引用?

A17:没放maven,采用本地引用方式。