常见问题
Q1. 签约回调通知失败后,会重发吗?
会重发,总计会重发10次,所以请商户收到后请返回确认,并且能处理重复接收的情况。重发机制如下:0s 第1次通知;10s 第2次通知;30s 第3次通知;1min 第4次通知;3min 第5次通知;10min 第6次通知;30min 第7次通知;1hour 第8次通知;6hour 第9次通知;20hour 第10次通知。
Q2. H5支付时如何定制导航栏?
考虑到各应用的导航栏会存在个性化需求,接口和页面不支持导航栏展示,如有显示需求,需应用自己开发访问H5页面。实现时需注意如下几点:
1、通过isCMBAPPInstalled判断是否已安装手机银行,已安装场景下通过sendRequest发送请求,未安装场景下才需访问H5页面。
2、需通过Post发送H5请求,body中包含信息见下图。
3、浏览器需注入CMBSDK.callback(respCode, respMessage)回调方法,用于支付结果知会。
4、HTTP请求头中需设置Content-Type为application/x-www-form-urlencoded,举例:[request setValue:@”application/x-www-form-urlencoded” forHTTPHeaderField:@”Content-Type”];
参数名 | 说明 |
---|---|
cmbpbsdk_appid | 商户在招商银行业务功能系统中的appid,这里是10位商户号 |
cmbpbsdk_method | 业务功能类型 |
sdk_deviceType | 设备类型(D/E),D: iPhone, E: Android |
…. | 支付、协议、领券业务功能等请求参数,具体内容由业务功能吗给出具体内容。与CMBRequest的requestData一致。 |
拼接示例如下:
“cmbpbsdk_appid=0025000017& cmbpbsdk_method=pay&sdk_deviceType=D&”+ requestData
注:如果是商户自定义实现H5,在H5支付场景下无需通过SDK的回调来识别
1、如果是支付页返回告知,商户通过注入js,在js实现方法中即可获知反馈结果。
2、如果是用户通过导航栏或手势等方式返回,商户可自行侦听这些行为来识别用户取消支付。
iOS具体实现参看如下:(任一方案即可,接入方自行选择)
方案一:WKWebview实现
1、JS注入代码
WKWebView *wkwb = WKWebView.new; NSString *js = @"window.CMBSDK = window.CMBSDK || {};window.CMBSDK.functionName = function(version,url){window.webkit.messageHandlers.CMBSDK.postMessage(url)};"; //document开始时注入 WKUserScript *wkUScript = [[WKUserScript alloc] initWithSource:js injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:YES]; [wkwb.configuration.userContentController addUserScript:wkUScript]; //CustomerJSHandler是自己创建的类需要实现WKScriptMessageHandler协议 CustomerJSHandler *handler = [[CustomerJSHandler alloc] init]; handler.webView = wkwb; [wkwb.configuration.userContentController removeScriptMessageHandlerForName:@"CMBSDK"]; [wkwb.configuration.userContentController addScriptMessageHandler:handler name:@"CMBSDK"];
2、实现CustomerJSHandler,该类需要实现WKScriptMessageHandler协议,并实现以下方法接收JS调用事件
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{ //通过解析 message中的 name body等信息处理具体接口的转发调用, //比如网页端调用了 window.CMBSDK.function1, 那么可以通过 message中的 name body等信息识别出参数,通过不同的参数处理各自的逻辑 }
方案二:UIWebview注入实现
1、 增加JS方法映射
#import <JavaScriptCore/JavaScriptCore.h> @protocol CMBJSDelegate <JSExport> JSExportAs(callback,- (void)call:(NSString *)respCode back:(NSString *)respMessage); @end
2、页面加载完成后注入JS方法
- (void)webViewDidFinishLoad:(UIWebView *)webView { JSContext *context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]; context[@"CMBSDK"] = self; context.exceptionHandler = ^(JSContext *context, JSValue *exceptionValue) { context.exception = exceptionValue; }; } - (void)call:(NSString *)respCode back:(NSString *)respMessage{ //根据响应码及内容进行后续逻辑处理 }
android具体实现参看如下:
1、webview注入JS
CMBSDKExecutor mCmbSdkExecutor = new CMBSDKExecutor(new CMBSDKExecutor.CMBSDKExecutorListener(){ @Override public void onCMBSDKExecutor(String respCode, String respString) { //可执行关闭当前页面,并通过intent将数据回传给之前的activity } mWebView.addJavascriptInterface(mCmbSdkExecutor, "CMBSDK");
2、接收页面回调
CMBSDKExecutorListener mListener; @JavascriptInterfacepublic int function1(String respCode, String respString) { //数据由网页回传 mListener.onCMBSDKExecutor(respCode, respString); } public CMBSDKExecutor(CMBSDKExecutorListener listener) { mListener = listener;} public interface CMBSDKExecutorListener { void onCMBSDKExecutor(String respCode, String respString); }
Q3. 为什么绑卡成功后收到了签约回调请求,但是参数什么数据都没有?
招行是以POST方式提交数据的,通知内容在jsonRequestData参数中传递,请从jsonRequestData参数中读取通知即可。
Q4. 生产环境的银行通知公钥与测试环境的是否相同?
不相同。
Q5. 银行通知公钥会变吗?是否每次验签前需要查询新的通知公钥
银行通知公钥会定期更换,更换频率较低。银行通知公钥可以每天取一次,存在本地,每次验签时使用即可,每天凌晨2:15发起查询招行公钥请求更新公钥。
Q6. 回调地址有哪些要求?
1、测试环境目前只支持端口为80、8081、443的IP地址进行回调
2、测试环境不支持HTTPS
3、回调通知POST方式发送
4、虽然前端也支持支付结果的回调,但是以后台的支付成功结果为准
Q7. 我用.NET做开发,可以直接用查询到的通知公钥来初始化X509Certificate2对象,然后从中获取RSACryptoServiceProvider对象吗?
不能,在.NET不能直接这样处理,需要先对通知公钥做转换处理,可以参考文档提供的C#验签示例。
Q8. App支付的开发过程中报非法商户:商户参数未定义。
需在商户管理系统配置返回地址scheme。scheme配置:scheme由招商银行配置并下发商户,iOS和安卓需保持一致,保证唯一即可,用于app支付成功后跳回应用。 (scheme 建议调整增加下应用独有的信息,不要直接用cmbmobile)
scheme商户配置好后,需要分行去商户管理平台界面配置一下返回商户地址。