Android 微盟云SDK接入
1、运行环境
Android 5.0 或更高
2、引入SDK
2.1. 在项目根目录的build.gradle中声明maven仓库, 如下所示:
allprojects {
repositories {
maven {
url 'https://dl.bintray.com/weimob/maven'
}
maven {
url 'https://maven.google.com'
}
mavenCentral()
jcenter()
google()
}
}
2.2. 在子项目build.gradle的dependencies中引入依赖:
compile 'com.web.library.groups:webviewsdk:1.0.4'
3、混淆规则
# WMWebView SDK start
-dontwarn com.web.**
-keep class com.web.library.groups.** { *; }
-dontwarn com.weimob.library.groups.**
-keep class com.weimob.library.groups.** { *; }
-dontwarn com.alibaba.fastjson.**
-keep class com.alibaba.fastjson.** { *; }
#Fresco
# Keep our interfaces so they can be used by other ProGuard rules.
# See http://sourceforge.net/p/proguard/bugs/466/
-keep,allowobfuscation @interface com.facebook.common.internal.DoNotStrip
# Do not strip any method/class that is annotated with @DoNotStrip
-keep @com.facebook.common.internal.DoNotStrip class *
-keepclassmembers class * {
@com.facebook.common.internal.DoNotStrip *;
}
# Keep native methods
-keepclassmembers class * {
native <methods>;
}
#WMWebView SDK end
4、配置权限
权限由接入方自己在manifast文件中配置,下面是SDK用到的相关权限
<!-- 允许应用程序联网 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 检测联网方式, 区分用户设备使用的是2G、3G或是WiFi -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 外部存储写入权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 为了更好的体验需要获取地理信息的权限 (以下非必须权限) -->
<uses-permission android:name="android.permission.ACCESS_GPS" />
<uses-permission android:name="android.permission.ACCESS_ASSISTED_GPS" />
<uses-permission android:name="android.permission.ACCESS_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
特殊权限说明: · 外部存储读写权限是用于文件选择 · 网络状态权限是用于处理网络
5、初始化SDK
在AndroidManifest中配置scheme(支付回调需要对scheme进行匹配) 示例如下:
<activity android:name=".Login.LoginActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!--scheme : xxx.n.weimob.com-->
<data android:scheme="wmsdk.n.weimob.com" />
</intent-filter>
</activity>
在Application或者加载页面之前对SDK进行初始化, 示例如下:
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// 1.初始化SDK------------------------------
// 需和manifest配置scheme一致
// String scheme = "wmsdk.n.weimob.com";
// WebViewSdk.getInstance().init(scheme);
}
}
APP启动后获得ticket设置appTicket至SDK 示例如下:
从这开始是SDK的使用步骤 ,关于setAppTicket(appTicket)里面的appTicket在后面会有说明怎么获取
public class MainActivity extends Activity {
@Override
public void onCreate() {
super.onCreate();
// 1.已登录直接setAppTicket------------------------------
// WebViewSdk.getInstance().setAppTicket(appTicket);
// 2.未登录则登录后setAppTicket------------------------------
// Logoin.toLogin() -> onLoginSuccess -> WebViewSdk.getInstance().setAppTicket(appTicket);
}
}
初始化WebviewActivity及webview, 示例如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.web.library.groups.webviewsdk.core.WMWebView
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
6、登录认证
注:登录验证失败或登录超时务必重新登录并在登录成功后设置新的appTicket
public class WebviewActivity extends Activity {
@Override
public void onCreate() {
super.onCreate();
WebViewSdk.getInstance().setOnAuthExpiredListener(new
WebViewSdk.OnAuthExpiredListener() {
@Override
public void onAuthExpired() {
// TODO 登录超时或登录失效,需重新登录获取新的appTicket,根据需求自行添加逻辑
//1) Login.toLogin
//2) loginSuccess
//3) WebViewSdk.getInstance().setAppTicket(appTicket);
}
});
}
}
否则请关闭WebviewActivity
WebViewActivity添加onActivityResult 示例如下:
public class WebviewActivity extends Activity {
@Override
public void onActivityResul (int requestCode, int resultCode, Intent data) {
super. onActivityResult (requestCode, resultCode, data);
webview.onActivityResult(requestCode, resultCode, data);
}
}
loadUrl(url):
public class WebviewActivity extends Activity {
private void load (String url) {
webview.loadUrl(url);
}
}
@Override
protected void onResume() {
super.onResume();
if (webView != null) {
webView.onResume();
}
}
7、注册监听获取webview加载状态
public class WebviewActivity extends Activity {
@Override
public void onCreate() {
webView.setWebStateClient(new WMWebView.WMWebStateClient() {
@Override
public void onReceivedTitle(WebView view, String title) {
if (!TextUtils.isEmpty(title))
L.d("onReceivedTitle========:" + title);
}
@Override
public void pageStarted(WebView view, String url, Bitmap favicon) {
L.d("pageStarted========");
}
@Override
public void pageFinished(WebView view, String url) {
L.d("pageFinished========");
}
@Override
public void onProgressChanged(WebView view, int newProgress) {
L.d("onProgressChanged========: " + newProgress);
}
});
}
}
App开店接口获取AppTicket参数
接口使用常见问题
APP开店接口如何使用?
配置接口在开始流程之前使用(只需要配置一次),登录接口和登出接口在流程中使用(都是c端使用),校检接口是结合配置接口使用的。 ①配置接口:
一个用户通过ticket实现免登,免登陆是有周期时长的,默认15天。 配置登录回调地址, 当登录状态过期后(15天后)会跳转到商户设置的
loginCallBack,然后你们根据用户当前的登录态来处理 (如果在APP里是已登录重新生成app
ticket访问微盟,这个时候并不能判断是哪个人登录过期了)。
如果已登录可以获取新的appticket继续访问。如果不配置,登录过期后(15天后)需要重新进入H5商城。
②查询配置接口:查询登录回调地址和过期时间 ③登录接口:通过登录接口生成appticket,实现免登。APPticket用法: H5
嵌入是把ticket拼接到链接上, SDK是把ticket直接填过去。 ④登出接口:在免登录未过期期间,若需主动登出须使用登出接口
⑤校检接口:和配置接口结合使用。主动登出 或 到期登出时需要配置, 不配置就会出现报错。
1,access token如何获取?
请参照此文档操作获取,商户授权文档:http://yun.weimob.com/saas/word/detail.html?tag=564&menuId=2
2,openUserId是什么?如何入参?
商户自有APP用户的唯一标识,可以使用商户自有APP的用户id。 openUserId可以是手机号、用户id等,可以唯一标识用户身份就行。
3,APP内免登录的openUserId如果是APP的用户标识的话,如何对应的微盟用户?
通过登录接口 openUserId 会生成微盟用户wid,这时app用户和微盟用户就关联上了
4,appClientId是什么?如何获取?
appClientId是商户在开放平台的clientId,商户pid+appClientId+商户openUserId对应唯一微盟用户,使用H5接入时必须拼接参数appClientId。
在微盟后台营销-开发者中心-创建应用-api权限-获取clientId。
5,appTicket是什么,怎么获取?
appTicket:作为一次用户认证的票据,有效期5分钟,只能使用一次。使用之后无效。
appTicket获取方式:使用登录接口yun.weimob.com/saas/word/detail.html?tag=519&menuId=4
6,loginCallbackUrl是什么?
loginCallbackUrl是商户登录回调地址,使用H5接入时必须设置。当用户的登录过期后,会回调该地址,需进行安全校验和登录校验,之后跳转到参数redirectUrl页面。
这个使用场景是用户在使用过程中登录状态失效,这时需要app端重新验证用户登录状态,然后重新访问用户当前页面。需要配置商家的URL,校验合法性和用户在app端的登录态。
7,loginCallbackUrl登录回调地址应该怎么配?
loginCallbackUrl?nonceStr=nonceStr×tamp=timestamp&redirectUrl=redirectUrl&sign=sign
redirectUrl可以是APP登录页面的url
8,微盟页面url如何获取?
9、设置商户配置接口如何使用?
config是商户级别的配置,只需要配置一次。这个只是两个配置项: numberScale (预计有多少用户使用免登) expires
(用于通过免登登录后,登录状态保留多久)
10,登录接口
这个接口调用成功,客户也不会出现在列表页,需要访问商城等才会出现在列表页
11,APP里登录了不用再在微盟登录 对接免登接口可以实现吗 ? 还需要先把客户导入微盟商城吗?
免登是用户通过APP登录到微商城的时候,生成wid和用户信息的。不需要把客户提前导入微盟商城的。后续通过绑定手机号,可以跟微盟自有的用户进行合并。免登的用户拥有wid,也在微盟后台客户列表。
12,免登后为什么无法使用客户详情接口?
免登的客户使用客户详情接口需要免登的用户完成一次登录流程之后:第一步,商户通过开放平台获取ticket;第二步,使用ticket去登录微商城;这时微商城前端会校验这个ticket,如果校验通过登录成功,
这时这个wid会成为客户,登录就完成了。
13,登录的时候传了手机号码,为什么还显示没有绑定手机号码?
登录时的手机只是作为联系方式,不会直接绑定,需要用户自己绑定。(在自有app里登录的用户不会自动绑定手机号,telephone只是做为联系方式
,需要到用户中心手动绑定)
14,wid 获取ticket(登录接口), 客户生成时间: 用户访问微盟前端校验ticket。
所以如果要绑定手机号,必须在客户访问微盟免登之后(有wid后)去绑定
15,免登陆是有周期时长的,还是永久的?嵌入到APP中的,是否每过15天,都需要重新登录?
登录成功后,默认有效期15天。 登录状态过期后,会跳转到商户设置的 loginCallBack,然后你们根据用户当前的登录态来处理。
如果已经登录的话,可以获取新的appticket继续访问。
16,为什么免登对接好了,用户登录时还需要通过手机验证码登录?
凡是跳转手机号登录的,都是免登接入不对,请参照免登文档排查下。
17,如何根据openUserId查询wid?
使用根据openUserId查询wid接口:http://yun.weimob.com/saas/word/detailApi.html?tag=312&menuId=1&id=1152
18,如何根据wid查询openUserId?
使用根据wid获取用户信息接口
:http://yun.weimob.com/saas/word/detailApi.html?tag=312&menuId=1&id=725
19,如何查询免登生成的客户信息?
使用客户详情接口:http://yun.weimob.com/saas/word/detailApi.html?tag=315&menuId=1&id=652
20,不使用APP账户登录,不对接免登,使用验证码登录的方式,每次都要登录的。
目前是不支持存储登录状态的,只要关掉再打开就需要重新登录。
21,对接免登对APP的登录式有要求吗?
没限制的 ,APP使用手机号登录,微信登录,其他方式(学号)登录都可以的
22,为什么App中商城分享不了页面?
H5商城分享目前不支持 App 场景
23,APP里的H5微商城不支持分享。但是用APP原生浏览器分享出去的H5链接是可以正常打开和支付的。
24,APP上的商城设置和小程序商城能否不一样,可以分别设置吗?
这个无法实现的,公众号商城,小程序商城和APP里的H5商城都是在微盟后台统一设置管理的 ,展示页面是同样的。
25,App里商城的导航元素是否支持自定义?
目前仅底部导航 tabbar 可配置
26,APP是否可以直接跳到微盟商品列表/购物车/个人中心页面?
可以,需要在APP原生页面添加入口,跳转微盟H5页面链接。一般是先到 APP 里的H5商城再到各个页面如商品,购物车,个人中心等。
27,APP开店支持的营销活动组件有哪些?
APP开店H5商城不支持分享,微盟已有的活动组件里不支持微信强授权的和只适用小程序的营销活动。
活动组件列表:https://docs.qq.com/sheet/DYXZXQ2FJUkhvTFp1?tab=BB08J2
28,APP开店支持公众号模板消息吗 ?如自提通知、下单成功通知、活动提醒等消息
不支持,APP嵌的H5是非微信环境的,公众号推送消息通知的前提是关注微信公众号,在微信环境下才可以。
29,APP开店支持发送客服消息吗?可以使用微客服吗?
支持微客服。
30,对接APP开店后,可以在APP商城里看到微盟小程序订单吗?
可以。用户如果绑定了手机号各渠道wid合并后,全渠道订单在APP里都可以看到的
31,按照安卓-SDK集成后,APP里的微客服发送不了图片,是什么原因?
SDK配置权限的那些在activity里面可以在fragment里面不行,可能因为activity里嵌套fragment
onActivityResul失效了。
检查方式:在你们的WeimobFragment里面onActivityResult打一个log选择图片回来后是否会回到这个方法,如果不会,那就是你的activity的onActivityResult并没有回调到你的WeimobFragment
【安卓缓存清理代码】
Q:为什么同一个手机登录不同的账号显示出来的商城和优惠劵页面还是上一个账号的商城和优惠券内容?
需要在webview退出的时候手动清除cookie、session缓存,可根据需求清除对应的,下方有清除所有缓存的示例代码,可供参考。
WebviewActivity :
@Override
protected void onDestroy() {
try {
CookieSyncManager.createInstance(this.getApplicationContext());
CookieManager cookieManager = CookieManager.getInstance();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
cookieManager.removeSessionCookies(null);
cookieManager.removeAllCookie();
cookieManager.flush();
} else {
cookieManager.removeSessionCookie();
cookieManager.removeAllCookie();
CookieSyncManager.getInstance().sync();
}
} catch (Exception e) {
e.printStackTrace();
}
if (webView != null) {
webView = null;
}
super.onDestroy();
}
SDK使用常见问题
1、appTicket怎么获取?
appTicket:作为一次用户认证的票据,有效期5分钟,只能使用一次。使用之后无效。
appTicket获取方式:使用登录接口yun.weimob.com/saas/word/detail.html?tag=519&menuId=4
2、为什么SDK配置好了 ,“购物车”和 “我的” 页面会提示“请在微信客户端打开链接”?
答:是因为H5环境未开启
3,请问下 这个SDK是仅仅提供接口 还是连页面一起提供了?
sdk相当于封装了一个浏览器。具体加载的页面取决于商户自己。例:loadUrl(“您微商城的url”)
4,请问下 app提供微信登录吗?
登录是商户自己的,要接入什么第三方登录取决于商户自己的业务需求。微盟这边没要求,只要在照常跟你们后端交互拿到appTicket给到SDK就行。
5,智慧零售对接SDK后显示如图,不进入店铺首页,怎么处理?
不要走推荐,直接使用主门店链接即可https://100000887668.retail.n.weimob.com/saas/retail/100000887668/2089978668/shop/index
6,APP开店可以使用APP自有支付方式吗?
不能,目前只能使用微盟的H5支付-微信支付。
7,报错”商家未设置支付方式,请联系商家处理“、“支付失败了,请联系商户检查支付配置”,怎么处理?
这个报错是因为H5支付没有配置好,请参考文档排查下 或者咨询微盟客服寻求帮助
H5支付配置:http://help.console.weimob.com/#/app/instruction?queryurl=%2Fhelp%2Fbase%2Fcore%2Fpage%2F2476%2F1
8,其他支付常见报错&处理办法
微信H5支付配置:https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_4
9,APP开店 如果登录信息失效了,客户端如何获取失效的状态通知,更新登录信息?
1, 安卓sdk文档里这句 否则请关闭WebviewActivity ,判断的条件是什么?
重新获取到appTicket重新set。否则(例:网络失败、用户取消…等)关闭
若不成功重新获取appTicket给到sdk。那ticket验证一直处于失败,会是空白页,所以需要关闭。理解这个就ok了,具体逻辑根据你们业务需求
2:安卓SDK配置出现这个报错是什么原因?
报了这个错,说明你们手动在你的webviewactivity设置了webviewclient。而微盟目前没有开放这个给商户设置(目前没有开放外部去重新设置webviewclient),请自行检查下代码。
3:为什么同一个手机登录不同的账号显示出来的商城和优惠劵页面还是上一个账号的商城和优惠券内容,我看了下是你们SDK里面添加了缓存导致,请问如何清除你们SDK的缓存?
WebviewActivity :
@Override
protected void onDestroy() {
try {
CookieSyncManager.createInstance(this.getApplicationContext());
CookieManager cookieManager = CookieManager.getInstance();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
cookieManager.removeSessionCookies(null);
cookieManager.removeAllCookie();
cookieManager.flush();
} else {
cookieManager.removeSessionCookie();
cookieManager.removeAllCookie();
CookieSyncManager.getInstance().sync();
}
} catch (Exception e) {
e.printStackTrace();
}
if (webView != null) {
webView = null;
}
super.onDestroy();
}
4:商户使用安卓SDK配置的,反馈说没有返回按钮和标题栏 ,请问下这个是在哪块配置的?安卓SDK提供页面加载监听回调吗?
注册监听获取webview加载状态
public class WebviewActivity extends Activity {
@Override
public void onCreate() {
webView.setWebStateClient(new WMWebView.WMWebStateClient() {
@Override
public void onReceivedTitle(WebView view, String title) {
if (!TextUtils.isEmpty(title))
L.d("onReceivedTitle========:" + title);
}
@Override
public void pageStarted(WebView view, String url, Bitmap favicon) {
L.d("pageStarted========");
}
@Override
public void pageFinished(WebView view, String url) {
L.d("pageFinished========");
}
@Override
public void onProgressChanged(WebView view, int newProgress) {
L.d("onProgressChanged========: " + newProgress);
}
});
}
}
获取Token原地址:http://yun.weimob.com/saas/word/detail.html?tag=564&menuId=2
Android
SDK文档原地址:http://yun.weimob.com/saas/word/detail.html?tag=514&menuId=4
App开店接口文档原地址:http://yun.weimob.com/saas/word/detail.html?tag=740&menuId=4