开发指南

H5直接嵌入


用户免登录

核心功能

1. 对于有一定开发能力的商户,可以通过少量的开发,直接将微商城/智慧零售的H5接入到自有应用中;

2. 打通账号体系,用户免登陆使用微盟提供的服务;

3. 统一登录授权解决方案,保持通用性和易接入性、安全性。


核心字段

· openUserId:商户自有APP用户的唯一标识,可以使用商户自有APP的用户id

· appClientId:商户在开放平台的clientId,商户pid+appClientId+商户openUserId对应唯一微盟用户,使用H5接入时必须拼接参数appClientId

· appTicket:作为一次用户认证的票据,有效期5分钟,只能使用一次。使用之后无效。

· loginCallbackUrl:商户登录回调地址,使用H5接入时必须设置。当用户的登录过期后,会回调该地址,需进行安全校验和登录校验,之后跳转到参数redirectUrl页面

备注:clientid获取流程:http://yun.weimob.com/doc/article?tag=ab


功能流程图



接入流程

1. 接入开放平台,获取到开放平台clientId,获取路径:开发者中心-创建应用-获取clientId;

2. 通过设置接口,完成商户配置;

3. 通过登录接口,获取appTicket;

4. 使用appTicket+appClientId(开放平台clientId)授权访问前端地址;

5. 接入登出接口,完成登出操作;

6. 通过H5接入时,需要开发登录回调页面,完成登录过期重新授权,并将地址填入上述设置。

 

支付回调


Android


a. 在下单接口中拦截微信支付链接http://wx.tenpay.com/

b. 拿到http://wx.tenpay.com/…链接中的参数redirect_url取域名设置到webview请求头中,再loadUrl

c. 拦截weixin://协议,跳转到微信支付

具体的需要拦截的请求:

前缀:https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb



AnalysisURLUtil类getUrlParam方法:

WebviewActivity:

webView.setWebViewClient(new WebViewClient() {

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                Log.e("nosdk===>shouldO ", url);
                boolean need = false;
                if (Util.isEmpty(url)) {
                    return need;
                }
                String redirectURLKey = "redirect_url";
                if (url.startsWith("https://wx.tenpay.com/")) {
                    need = true;
                    Map<String, String> urlParam = AnalysisURLUtil.getUrlParam(url, false);
                    String oldReicUrl = urlParam.get(redirectURLKey);
                    if (urlParam != null) {
                        try {
                            Map header = new HashMap<String, String>();
                            header.put("Referer", URLDecoder.decode(oldReicUrl, "utf-8"));
                            view.loadUrl(url, header);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }

                } else if (url.startsWith("weixin://")) {
                    need = true;
                    Intent intent = null;
                    try {

                        intent = Intent.parseUri(url.toString(), Intent.URI_INTENT_SCHEME);
                        intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
                        // forbid launching activities without BROWSABLE category
                        intent.addCategory("android.intent.category.BROWSABLE");
                        // forbid explicit call
                        intent.setComponent(null);
                        // forbid intent with selector intent
                        intent.setSelector(null);
                        NoSdkWebviewActivity.this.startActivity(intent);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                if (need) {
                    return need;
                } else {
                    return super.shouldOverrideUrlLoading(view, url);
                }

            }
        });






AnalysisURLUtil:

/**
     * 获取Url字符串的参数
     *
     * @param url
     * @return
     */
    public static Map<String, String> getUrlParam(String url, boolean isDecode) {
        Map<String, String> paramMap = new HashMap<String, String>();
        if (Util.isEmpty(url)) {
            return paramMap;
        }
        try {
            URI uri = new URI(url);
            String params = isDecode ? uri.getQuery() : uri.getRawQuery();
            if (params != null && !"".equals(params)) {
                String paramArray[] = params.split("&");
                if (paramArray != null && paramArray.length != 0) {
                    for (String pams : paramArray) {
                        String keyValuePams[] = pams.split("=");
                        if (keyValuePams != null && keyValuePams.length == 2) {
                            if (isDecode) {
                                paramMap.put(keyValuePams[0], URLDecoder.decode(keyValuePams[1], "UTF-8"));
                            } else {
                                paramMap.put(keyValuePams[0], keyValuePams[1]);
                            }
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return paramMap;
    }



iOS


1. 在APP工程配置中设置URL Scheme,比如 xx.n.weimob.com(其中xx为:店铺pid,n.weimob.com固定不变。如,商户A的店铺pid为1122,则URL Scheme为1122.n.weimob.com),如果app已有scheme,可以新增一个,app可以有多个scheme。


 

2. 在webView代理方法中拦截微信下单请求(注意是下单请求不是下单返回结果),在这个请求的基础上生成新的请求,新的请求追加或修改参数redirect_url为你的URLScheme,即redirect_url=URLEncode(wm123.company.com://),cancel掉原来的请求,webView加载这个新的请求。

具体的需要拦截的请求:

前缀:https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb

拦截方法根据不同WebView不同:

l UIWebView

webView:shouldStartLoadWithRequest:navigationType:

l WKWebView

webView:decidePolicyForNavigationAction:decisionHandler:

 

微信支付结束会发起redirect_url的重定向,webView拦截 request.URL.scheme 包xx.n.weimob.com://的请求,在这里可以做一些后续操作,比如 刷新页面,通知前端支付完成等


拦截流程图



webview 代理方法添加代码

( 其中self.redirectURL 为1中的 URLScheme 加上 :// )


URLUtil合并param的方法:


+ (NSDictionary *)getURLAndParameter:(NSString *)url{
    NSArray *components = [url componentsSeparatedByString:@"?"];
    NSString *path = components.firstObject;
    if (path.length > 0){
        NSMutableDictionary *mutDict = [NSMutableDictionary dictionary];
        mutDict[@"URL"] = path;
        NSString *dataStr = [url substringFromIndex:path.length];
        if (dataStr.length > 0){
            //去掉?
            dataStr = [dataStr substringFromIndex:1];
            
            NSMutableDictionary *params = [NSMutableDictionary dictionary];
            NSArray* paramParis = [dataStr componentsSeparatedByString:@"&"];
            for (NSString *param in paramParis){
                NSArray *kv = [param componentsSeparatedByString:@"="];
                [params setObject:kv.lastObject forKey:kv.firstObject];
            }
            mutDict[@"PARAMS"] = params;
            
        }
        
        return mutDict;
    }
    return nil;
}

+ (NSString *)generateURL:(NSString *)host params:(NSDictionary *)params{
    NSMutableString *mutString = [NSMutableString string];
    [mutString appendString:host];
    NSArray *allKeys = params.allKeys;;
    if (allKeys.count > 0){
        [mutString appendString:@"?"];
        for (int i = 0; i < allKeys.count; i++){
            id key = allKeys[i];
            id value = params[key];
            [mutString appendString:[NSString stringWithFormat:@"%@=%@",key,value]];
            if (i < params.count - 1){
                [mutString appendString:@"&"];
            }
            
        }
    }
    return mutString;
}

售前咨询热线

10105188

在线QQ咨询

关注微盟

扫描关注官方微信

总部咨询热线:10105188 QQ:4006305400 邮箱:feedback@weimob.com 举报电话:02180356016

地址:上海市宝山区长江路258号微盟大厦

Copyright © 2011-2019 yun.weimob.com. All Rights Reserved 上海微盟企业发展有限公司版权所有 沪ICP备14044897号-9