周期扣款

常见问题

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商户配置好后,需要分行去商户管理平台界面配置一下返回商户地址。