Android MSSDK集成文档
<p>[TOC]</p>
<h2>修改记录</h2>
<table>
<thead>
<tr>
<th>SDK版本</th>
<th>时间</th>
<th>修改内容</th>
<th>责任人</th>
<th>备注</th>
</tr>
</thead>
<tbody>
<tr>
<td>v1.0.0</td>
<td>2019/07/26</td>
<td>增加一键登录等</td>
<td>wesley</td>
<td>无</td>
</tr>
<tr>
<td>v1.4.1.2</td>
<td>2019/11/07</td>
<td>新增带UI的用户协议,隐私政策接口说明</td>
<td>tenk</td>
<td>需要更新SDK到1.4.1.2版本</td>
</tr>
<tr>
<td>v1.5.0</td>
<td>2019/12/11</td>
<td>新增获取微信头像和昵称接口,新增获取附件好友接口,MSLDConfi新增字段</td>
<td>leevin.li</td>
<td>需要更新SDK到1.5.0版本</td>
</tr>
<tr>
<td>v1.5.1</td>
<td>2019/12/23</td>
<td>新增支付可以使用客户端传入的回调地址,新增修改用户信息的全局回调</td>
<td>laimo.li</td>
<td>需要更新SDK到1.5.1版本</td>
</tr>
<tr>
<td>v1.9.0</td>
<td>2020/03/20</td>
<td>1.LBS新增授权接口 2.微博分享</td>
<td>leevin.li</td>
<td>需要更新SDK到1.9.0版本</td>
</tr>
<tr>
<td>v1.9.3</td>
<td>2020/03/30</td>
<td>1.新增openinstall插件 2.更新问卷调查title</td>
<td>nic.huang</td>
<td>需要更新SDK到1.9.3版本</td>
</tr>
</tbody>
</table>
<h2>重要信息</h2>
<p>在接入SDK之前,需要在我们后台申请账号并且创建应用参数,具体可以参考 <a href="https://www.showdoc.cc/mssdk?page_id=2692703335764519">技术中台服务接入指南</a> 文档。</p>
<p>本文档中涉及到的 <code>错误码</code> 可以参考下面链接的内容。</p>
<p>Android SDK 错误码可以参考 <a href="https://www.showdoc.cc/mssdk?page_id=2634523439445568">Android SDK 错误码</a> 文档;</p>
<p>在接入过程中有任何问题,可以 <a href="https://www.showdoc.cc/mssdk?page_id=2615409307929897">联系我们</a>。</p>
<p>开发者接入SDK完成后,可以按照我们提供的测试用例进行自测。测试用例如下:
<img src="https://github.com/veryitman/MSSDKResource/blob/mark-feature/sdk_test_case.png?raw=true" alt="" /></p>
<h3>1 文档概述</h3>
<ul>
<li>MSSDK(Micro Services SDK)是2019年技术中台提供的全新标准化SDK。</li>
<li>支持Android 4.1及以上系统,支持Android Studio开发工具。</li>
<li>本文主要描述Android MSSDK新手集成教程,API调用细则请参考<a href="https://www.showdoc.cc/mssdk?page_id=2634447955132290">《Android MSSDK API文档》</a>和接入Demo。</li>
</ul>
<p>如果需要出非乐逗公版即渠道包,需要另外接入 <a href="https://www.showdoc.cc/mssdk?page_id=2635412379373303">渠道API</a>,更多参考可以看 <a href="https://www.showdoc.cc/mssdk?page_id=2699369189270969">Android 接入技术常见问题</a> 文档。</p>
<p><em>备注:当前版本支持游戏发行业务在Android公版渠道基本最小范围的用户、支付和数据统计能力。</em></p>
<p><strong>特别注意:如果开发者的应用有服务器(如强登录的APP)资源可以考虑在服务端接入我们的相关接口,这样可以保证登录和支付的安全。具体接入文档可以查看 <a href="https://www.showdoc.cc/mssdk?page_id=2640157465255050">MSSDK 服务端接入文档</a>。</strong></p>
<h3>2 事项准备</h3>
<h4>2.1 创建微服务APP应用</h4>
<ul>
<li>登录<a href="http://biz.cloud.idreamsky.com">微服务业务控制台</a>创建应用,<span id="msConfig">将下载的配置文件 msConfig.json 放入工程目录下的 assets\msld\config 目录下。</span></li>
<li>
<p>如下图:
<img src="https://www.showdoc.cc/server/api/common/visitfile/sign/9bb32c077ddfb055c6995a3072b34bef?showdoc=.jpg" alt="" /></p>
</li>
<li>若无微服务帐号,请 <a href="https://www.showdoc.cc/mssdk?page_id=2615409307929897">联系我们</a>。</li>
</ul>
<h4>2.2 设置游戏支付回调地址</h4>
<ul>
<li>游戏支付回调地址是用于接收到账通知的URL,MSSDK在充值成功后会向URL发送同步请求</li>
<li>配置入口:<a href="http://biz.cloud.idreamsky.com">微服务业务控制台</a> ,如下图:</li>
<li><strong>注意</strong>:客户端发放商品的休闲游戏,请留空
<img src="https://www.showdoc.cc/server/api/common/visitfile/sign/c77083a001d6fecc580187ff268912a7?showdoc=.jpg" alt="" /></li>
</ul>
<h4>2.3 策划集成方案</h4>
<h5>2.3.1 登录页面</h5>
<ul>
<li>用户首次进入游戏,加载完游戏资源,进入「游戏登录页」</li>
<li>用户在「游戏登录页」点击「帐号登录」调起登录面板,点击「快速进入」使用游客登录流程。</li>
<li>设计参考:
<img src="https://www.showdoc.cc/server/api/common/visitfile/sign/baa59413a2563986e8cd800ccd4741a6?showdoc=.jpg" alt="" /></li>
</ul>
<h5>2.3.2 用户中心</h5>
<ul>
<li>用户成功登录进入游戏,游戏内提供「用户中心」入口,供用户维护帐号个人信息</li>
<li>设计参考1:游戏主界面提供入口
<img src="https://www.showdoc.cc/server/api/common/visitfile/sign/bd2716a54bb4839b05a897e3ea262139?showdoc=.jpg" alt="" /></li>
<li>设计参考2:游戏设置里提供入口
<img src="https://www.showdoc.cc/server/api/common/visitfile/sign/994bcb78967a6efd3da54cd9214e3687?showdoc=.jpg" alt="" /></li>
</ul>
<h3>3 SDK集成</h3>
<h4>3.1 获取SDK和配置文件</h4>
<ul>
<li>获取MSSDK资源aar包,请 <a href="https://www.showdoc.cc/mssdk?page_id=2615409307929897">联系我们</a></li>
<li>获取配置文件msConfig.json,<a href="#2.1创建微服务APP应用">请看2.1</a></li>
<li>有疑问请联系技术平台部-SDK开发平台组。</li>
</ul>
<p>可以通过SDK获取配置的渠道号信息,示例代码如下:</p>
<pre><code class="language-java">String channelId = MSLDSDK.syncAction(activity, SdkPath.ROUTE_GET_CHANNEL_ID, null);</code></pre>
<h4>3.2 配置开发环境</h4>
<ul>
<li>
<p>使用 Android Studio 开发工具,建议该IDE的版本为3.5及以上版本;</p>
</li>
<li>gradle版本建议4.6版本;</li>
</ul>
<h5>3.2.1 导入SDK资源到工程</h5>
<ul>
<li>在项目工程下,新建一个module,名称可以为MSSDK。并按照下图所示,将 <code>aar</code> 和 <code>msConfig.json</code> 拷贝到相应目录</li>
</ul>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/b3cf50719aa106dc0cc5dcbdb9f066df?showdoc=.jpg" alt="" /></p>
<h5>3.2.2 gradle配置</h5>
<ul>
<li>在您的工程中的build.gradle配置文件添加代码如下:</li>
</ul>
<pre><code class="language-gradle">android {
repositories {
flatDir {
dirs 'libs'
}
}
}
dependencies {
api fileTree(include: ['*.aar'], dir: 'libs')
}</code></pre>
<h4>3.3 初始化SDK(必须)</h4>
<ul>
<li>在游戏主Activity的onCreate()中调用初始化函数</li>
<li>调用示例:</li>
</ul>
<p><em>备注:初始化参数是从SDK配置文件中读取,参数错误会导致初始化失败,只有初始化成功,SDK的各项功能才能正常使用。</em></p>
<pre><code class="language-Android">MSLDSDK.initSDK(this, new MSLDCallback() {
@Override
void onSuccess(String msg, Object data) {
show("初始化成功");
}
@Override
void onFail(int code, String msg, Object errorData) {
show("初始化失败");
}
});</code></pre>
<h4>3.4 APP生命周期监听调用</h4>
<ul>
<li>将APP生命周期中发生的事件告知MSSDK。</li>
</ul>
<h5>3.4.1 调用Application生命周期监听接口(必须)</h5>
<ul>
<li>调用示例(在Application中重写系统函数,然后调用下面函数即可,共计5个):</li>
</ul>
<pre><code class="language-java">MSLDSDK.App.onCreate(this);
MSLDSDK.App.attachBaseContext(this, base);
MSLDSDK.App.onLowMemory(this);
MSLDSDK.App.onTrimMemory(this,level);
MSLDSDK.App.onConfigurationChanged(this,newConfig);</code></pre>
<h5>3.4.2 调用Activity生命周期监听接口(必须)</h5>
<ul>
<li>调用示例(在Activity中重写系统函数,然后调用下面函数即可,共计11个):</li>
</ul>
<pre><code class="language-java">MSLDSDK.Act.onCreate(activtiy, savedInstanceState);
MSLDSDK.Act.onRestart(activtiy);
MSLDSDK.Act.onStart(activtiy);
MSLDSDK.Act.onResume(activtiy);
MSLDSDK.Act.onPause(activtiy);
MSLDSDK.Act.onStop(activtiy);
MSLDSDK.Act.onDestroy(activtiy);
MSLDSDK.Act.onSaveInstanceState(activtiy, outState);
MSLDSDK.Act.onNewIntent(intent);
MSLDSDK.Act.onActivityResult(activtiy, requestCode, resultCode, data);
MSLDSDK.Act.onRequestPermissionsResult(activtiy, requestCode, permissions, paramArrayOfInt);</code></pre>
<p><strong>注意:如果不调用以上生命周期(Application、Activity)函数会导致一些莫名奇妙的问题。</strong></p>
<h3>4 功能接入</h3>
<ul>
<li>只有SDK初始化成功,才能调用MSSDK的各项功能。</li>
<li>MSSDK提供用户、支付和数据统计功能。</li>
</ul>
<h4>4.1 接入用户</h4>
<ul>
<li>MSSDK用户功能提供登录、用户中心和实名认证等能力。</li>
</ul>
<h5>4.1.1 登录面板</h5>
<ul>
<li>登录面板提供登录UI界面。</li>
<li>当前版本支持极光一键登录,手机号验证码、用户名密码和游客登录。</li>
<li>如果满足一键登录显示条件,则优先显示一键登录授权页,否则显示普通登录面板(手机号登录或帐号选择面板)</li>
</ul>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/d0891b8772faa274519a736665156b28?showdoc=.jpg" alt="" /></p>
<ul>
<li>调用示例:</li>
</ul>
<pre><code class="language-java">MSLDSDK.action(this, AccountPath.ROUTE_ACCOUNT_LOGIN, new HashMap<>(), new MSLDCallback<MSLDAccount>() {
@Override
public void onSuccess(String msg, MSLDAccount data) {
}
@Override
public void onFail(int code, String msg, Object errorData) {
}
});</code></pre>
<h5>4.1.2 游客登录</h5>
<ul>
<li>为用户创建游客帐号,无需进行任何验证,即可进入游戏体验。</li>
<li>调用示例:</li>
</ul>
<pre><code class="language-java">MSLDSDK.action(this, AccountPath.ROUTE_ACCOUNT_GUEST_LOGIN, new HashMap<>(), new MSLDCallback<MSLDAccount>() {
@Override
public void onSuccess(String msg, MSLDAccount data) {
}
@Override
public void onFail(int code, String msg, Object errorData) {
}
});</code></pre>
<h5>4.1.3 自动登录</h5>
<ul>
<li>用户场景:用户登录成功且无触发登出,再次启动游戏时无需验证,直接进入游戏。</li>
<li>SDK逻辑:游戏调用MSSDK自动登录接口,MSSDK使用最近一次登录信息进行自动登录。</li>
<li>调用示例:</li>
</ul>
<pre><code class="language-java">MSLDSDK.action(this, AccountPath.ROUTE_ACCOUNT_AUTO_LOGIN, new HashMap<>(), new MSLDCallback<MSLDAccount>() {
@Override
public void onSuccess(String msg, MSLDAccount data) {
}
@Override
public void onFail(int code, String msg, Object errorData) {
}
});</code></pre>
<h5>4.1.4 监听登录通知回调</h5>
<ul>
<li>用户在游戏过程可能发生登录状态变化,MSSDK通过通知类回调的方式告知游戏。</li>
<li>游戏在整个生命周期都需要监听「登录通知回调」,及时处理游戏帐号的业务逻辑。</li>
<li>当前版本存在初始化成功、用户登录成功、用户登出、切换帐号成功事件,调用示例:</li>
</ul>
<pre><code class="language-java">MSLDSDK.registerNotifyListener(new MSLDNotifyListener() {
@Override
public void notify(int code, String msg, Object data) {
switch (code) {
case NotifyCode.SWITCH_ACCOUNT:
// 切换帐号,并登录成功
MSLDAccount account = (MSLDAccount )data;
break;
case NotifyCode.ACCOUNTINFO_UPDATED:
//用户信息更新
break;
case NotifyCode.LOGOUT:
// 登出
break;
default:
// 其他
break;
}
}
});</code></pre>
<h5>4.1.5 用户中心</h5>
<ul>
<li>用户中心是对游戏帐号进行信息补充的地方,包含用户信息、手机绑定、密码设置、实名认证、切换帐号,快捷帐号等功能。</li>
</ul>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/c4e18a9e7041e466b548c86a61ece877?showdoc=.jpg" alt="" /></p>
<ul>
<li>调用示例:</li>
</ul>
<pre><code class="language-java">MSLDSDK.action(this, AccountPath.ROUTE_ACCOUNT_USER_CENTER, new HashMap<String, Object>(), new MSLDCallback() {
@Override
public void onSuccess(String msg, Object data) {
}
@Override
public void onFail(int code, String msg, Object errorData) {
}
});</code></pre>
<h5>4.1.6 实名认证(选接)</h5>
<ul>
<li>用户中心面板已有实名认证入口,单独的实名认证接口(含UI)支持游戏在其他场景下的直接调用。</li>
<li>调用示例:</li>
</ul>
<pre><code class="language-java">MSLDSDK.action(this, AccountPath.ROUTE_ACCOUNT_AUTHENTICATION, null, new MSLDCallback() {
@Override
public void onSuccess(String msg, @Nullable Object data) {
show("实名认证成功");
}
@Override
public void onFail(int code, String msg, @Nullable Object errorData) {
show("实名认证失败 " + msg);
}
});</code></pre>
<h5>4.1.7 获取用户信息(选接)</h5>
<ul>
<li>获取当前用户的用户信息,具体内容可查看<a href="https://www.showdoc.cc/mssdk?page_id=2634447955132290">《Android MSSDK API文档》</a></li>
<li>调用示例:</li>
</ul>
<pre><code class="language-java">MSLDAccount account = MSLDSDK.syncAction(this,AccountPath.ROUTE_ACCOUNT_LOGINED_USER_INFO,null);</code></pre>
<h5>4.1.8 用户名+密码登录</h5>
<ul>
<li>用户在乐逗注册且设置密码成功后,可通过用户名+密码登录</li>
<li>快捷帐号登录也属于用户名+密码登录。</li>
<li>调用示例:</li>
</ul>
<pre><code class="language-java">MSLDSDK.action(activity, AccountPath.ROUTE_ACCOUNT_DIRECT_USERNAME_LOGIN, new HashMap() {
{
put(AccountParam.KEY_USER_NAME, username);
put(AccountParam.KEY_PASSWORD, pwd);
}}, new MSLDCallback<MSLDAccount>() {
@Override
public void onSuccess(String msg, MSLDAccount data) {
}
@Override
public void onFail(int code, String msg, Object errorData) {
}
});</code></pre>
<h5>4.1.9 手机号+短信验证码登录</h5>
<ul>
<li>用户可通过手机号+验证码登录,无需注册</li>
<li>调用示例:</li>
</ul>
<pre><code class="language-java">MSLDSDK.action(activity, AccountPath.ROUTE_ACCOUNT_DIRECT_PHONE_LOGIN, new HashMap() {
{
put(AccountParam.KEY_PHONE_NUMBER, phoneNumber);
put(AccountParam.KEY_SMS_VERIFICATION_CODE, code);
}
},
new MSLDCallback<MSLDAccount>() {
@Override
public void onSuccess(String msg, MSLDAccount data) {
}
@Override
public void onFail(int code, String msg, Object errorData) {
}
});</code></pre>
<h5>4.1.10 微信登录</h5>
<ul>
<li>用户通过微信帐号登录,无需注册</li>
<li>微信参数和配置,请查看 <a href="https://www.showdoc.cc/mssdk?page_id=2638430478177500">《MSSDK 集成文档》4.3.2微信分享</a></li>
<li>调用示例:</li>
</ul>
<pre><code class="language-java">MSLDSDK.action(activity, AccountPath.ROUTE_ACCOUNT_DIRECT_WECHAT_LOGIN, new HashMap<>(), new MSLDCallback<MSLDAccount>() {
@Override
public void onSuccess(String msg, MSLDAccount data) {
}
@Override
public void onFail(int code, String msg, Object errorData) {
}
});</code></pre>
<h5>4.1.11 QQ登录</h5>
<ul>
<li>用户通过QQ帐号登录,无需注册</li>
<li>QQ参数和配置,请查看 <a href="https://www.showdoc.cc/mssdk?page_id=2638430478177500">《MSSDK 集成文档》4.3.1QQ分享</a></li>
<li>调用示例:</li>
</ul>
<pre><code class="language-java">MSLDSDK.action(activity, AccountPath.ROUTE_ACCOUNT_DIRECT_QQ_LOGIN, new HashMap<>(), new MSLDCallback<MSLDAccount>() {
@Override
public void onSuccess(String msg, MSLDAccount data) {
}
@Override
public void onFail(int code, String msg, Object errorData) {
}
});</code></pre>
<h5>4.1.12 登出</h5>
<ul>
<li>登出后,SDK将清除本次的登录信息,且本次登出的帐号无法在下一次进行自动登录</li>
<li>调用示例:</li>
</ul>
<pre><code class="language-java">MSLDSDK.action(activity, AccountPath.ROUTE_ACCOUNT_DIRECT_LOGOUT, new HashMap<>(), new MSLDCallback() {
@Override
public void onSuccess(String msg, Object data) {
}
@Override
public void onFail(int code, String msg, Object errorData) {
}
});</code></pre>
<h5>4.1.13 获取短信验证码</h5>
<ul>
<li>玩家在进行 "手机号+验证码登录"、"绑定手机号"、"更换手机号" 时,需要提前获取手机的短信验证码。</li>
<li>调用示例:</li>
</ul>
<pre><code class="language-java">MSLDSDK.action(activity, AccountPath.ROUTE_ACCOUNT_DIRECT_GET_VERIFY_CODE, new HashMap() {
{
put(AccountParam.KEY_PHONE_NUMBER, phoneNumber);
}
},
new MSLDCallback() {
@Override
public void onSuccess(String msg, Object data) {
}
@Override
public void onFail(int code, String msg, Object errorData) {
}
});</code></pre>
<ul>
<li>验证码使用场景说明</li>
</ul>
<table>
<thead>
<tr>
<th>验证码使用场景</th>
</tr>
</thead>
<tbody>
<tr>
<td>手机号 + 验证码登录</td>
</tr>
<tr>
<td>绑定手机号</td>
</tr>
<tr>
<td>重置密码</td>
</tr>
<tr>
<td>更换手机号</td>
</tr>
<tr>
<td>检查验证码是否正确</td>
</tr>
</tbody>
</table>
<h5>4.1.14 检查验证码是否正确</h5>
<ul>
<li>检查获取的手机短信验证码是否正确。</li>
<li>调用示例:</li>
</ul>
<pre><code class="language-java">MSLDSDK.action(activity, AccountPath.ROUTE_ACCOUNT_DIRECT_CHECK_VERIFY_CODE, new HashMap() {
{
put(AccountParam.KEY_PHONE_NUMBER, phoneNumber);
put(AccountParam.KEY_SMS_VERIFICATION_CODE, code);
}
},
new MSLDCallback() {
@Override
public void onSuccess(String msg, Object data) {
}
@Override
public void onFail(int code, String msg, Object errorData) {
}
});</code></pre>
<h5>4.1.15 查询手机号绑定的账号信息</h5>
<ul>
<li>一般有以下3种情况需要用到:</li>
<li>1 用户绑定之前,先检查该手机号是否已被其他账号绑定,如果是,则由此触发二选一。</li>
<li>2 更换手机号之前,检查该手机号是否已经被绑定,如果是,则不应继续操作,直接提示更换手机号失败。</li>
<li>3 在重置密码之前,检查该手机号是否有当前业务账号,如果否,则不应允许重置密码。</li>
</ul>
<pre><code class="language-java">MSLDSDK.action(activity, AccountPath.ROUTE_ACCOUNT_DIRECT_QUERY_PHONE_BIND_ACCOUNT, new HashMap() {
{
put(AccountParam.KEY_PHONE_NUMBER, phoneNumber);
}
},
new MSLDCallback() {
@Override
public void onSuccess(String msg, Object data) {
}
@Override
public void onFail(int code, String msg, Object errorData) {
}
});</code></pre>
<h5>4.1.16 绑定手机号</h5>
<ul>
<li>在游客登录后,获取到绑定手机号的验证码之后使用,完成帐号与手机号的绑定</li>
</ul>
<pre><code class="language-java">MSLDSDK.action(activity, AccountPath.ROUTE_ACCOUNT_DIRECT_BIND_PHONE, new HashMap() {
{
put(AccountParam.KEY_PHONE_NUMBER, phoneNumber);
put(AccountParam.KEY_SMS_VERIFICATION_CODE, code);
}
},
new MSLDCallback() {
@Override
public void onSuccess(String msg, Object data) {
}
@Override
public void onFail(int code, String msg, Object errorData) {
}
});</code></pre>
<h5>4.1.17 更换手机号</h5>
<ul>
<li>登录成功后,更换手机绑定,需要输入旧手机号和验证码,以及新手机号与验证码;</li>
</ul>
<pre><code class="language-java">MSLDSDK.action(activity, AccountPath.ROUTE_ACCOUNT_DIRECT_CHANGE_BIND_PHONE, new HashMap() {
{
put(AccountParam.KEY_PHONE_OLD, phoneold);
put(AccountParam.KEY_SMS_VERIFICATION_CODE_OLD, oldcode);
put(AccountParam.KEY_PHONE_NEW, phoneNew);
put(AccountParam.KEY_SMS_VERIFICATION_CODE_NEW, newCode);
}
},
new MSLDCallback() {
@Override
public void onSuccess(String msg, Object data) {
}
@Override
public void onFail(int code, String msg, Object errorData) {
}
});</code></pre>
<h5>4.1.18 设置密码</h5>
<ul>
<li>手机号登录后,可设置密码以便后期直接使用 "手机号+密码" 登录。</li>
<li>注意:必须要绑定手机号,才能设置密码</li>
</ul>
<pre><code class="language-java">MSLDSDK.action(activity, AccountPath.ROUTE_ACCOUNT_DIRECT_SET_PASSWORD, new HashMap() {
{
put(AccountParam.KEY_PASSWORD, pwd);
}
},
new MSLDCallback() {
@Override
public void onSuccess(String msg, Object data) {
}
@Override
public void onFail(int code, String msg, Object errorData) {
}
});</code></pre>
<h5>4.1.19 修改密码</h5>
<ul>
<li>根据旧密码重新设置密码</li>
<li>注意:必须要绑定手机号,才能修改密码</li>
</ul>
<pre><code class="language-java">MSLDSDK.action(activity, AccountPath.ROUTE_ACCOUNT_DIRECT_CHANGE_PASSWORD, new HashMap() {
{
put(AccountParam.KEY_NEW_PASSWORD, pwdNew);
put(AccountParam.KEY_OLD_PASSWORD, pwdOld);
}
},
new MSLDCallback() {
@Override
public void onSuccess(String msg, Object data) {
}
@Override
public void onFail(int code, String msg, Object errorData) {
}
});</code></pre>
<h5>4.1.20 重置密码</h5>
<ul>
<li>根据手机号和验证码重新设置密码</li>
</ul>
<pre><code class="language-java">MSLDSDK.action(activity, AccountPath.ROUTE_ACCOUNT_DIRECT_RESET_PASSWORD, new HashMap() {
{
put(AccountParam.KEY_PHONE_NUMBER, phoneNumber);
put(AccountParam.KEY_SMS_VERIFICATION_CODE, code);
put(AccountParam.KEY_NEW_PASSWORD, pwdNew);
}
},
new MSLDCallback() {
@Override
public void onSuccess(String msg, Object data) {
}
@Override
public void onFail(int code, String msg, Object errorData) {
}
});</code></pre>
<h5>4.1.21 实名认证</h5>
<ul>
<li>使用"姓名+身份证号"实现实名功能;</li>
<li>目前仅提供身份证号实名方式,该接口不包含UI功能,需要开发者自定义UI</li>
</ul>
<pre><code class="language-java">MSLDSDK.action(activity, AccountPath.ROUTE_ACCOUNT_DIRECT_AUTHENTICATION, new HashMap() {
{
put(AccountParam.KEY_REAL_NAME, realName);
put(AccountParam.KEY_CARD_ID,idCard);
}
},
new MSLDCallback() {
@Override
public void onSuccess(String msg, Object data) {
}
@Override
public void onFail(int code, String msg, Object errorData) {
}
});</code></pre>
<h5>4.1.22 获取用户协议</h5>
<ul>
<li>请求成功时,返回的data 是json格式的内容字符串,如:{"version":"1.0","content":"html格式内容"}</li>
<li>游戏接入时可直接获取content字段(html格式),进行展示;</li>
<li>SDK还提供了展示用户协议面板的功能。可以调用ROUTE_ACCOUNT_USER_AGREEMENT来展示。当用户点返回后,会收到回调返回码 ERROR_UI_USER_BACK ,游戏可以继续接下来的流程。</li>
</ul>
<pre><code class="language-java">MSLDSDK.action(activity, AccountPath.ROUTE_ACCOUNT_DIRECT_USER_AGREEMENT, new HashMap<>(), new MSLDCallback() {
@Override
public void onSuccess(String msg, Object data) {
}
@Override
public void onFail(int code, String msg, Object errorData) {
}
});</code></pre>
<pre><code class="language-java">MSLDSDK.action(activity, AccountPath.ROUTE_ACCOUNT_USER_AGREEMENT, null, new MSLDCallback() {
@Override
public void onSuccess(String s, @Nullable Object o) {
}
@Override
public void onFail(int i, String s, @Nullable Object o) {
}
});</code></pre>
<h5>4.1.23 获取隐私政策</h5>
<ul>
<li>请求成功时,返回的data 是json格式的内容字符串,如:{"version":"1.0","content":"html格式内容"}</li>
<li>游戏接入时可直接获取content字段(html格式),进行展示;</li>
<li>SDK还提供了展示隐私政策面板的功能。可以调用ROUTE_ACCOUNT_PRIVATE_AGREEMENT 来展示。当用户点返回后,会收到回调返回码 ERROR_UI_USER_BACK ,游戏可以继续接下来的流程。</li>
</ul>
<pre><code class="language-java">MSLDSDK.action(activity, AccountPath.ROUTE_ACCOUNT_DIRECT_PRIVATE_AGREEMENT, new HashMap<>(), new MSLDCallback() {
@Override
public void onSuccess(String msg, Object data) {
}
@Override
public void onFail(int code, String msg, Object errorData) {
}
});</code></pre>
<pre><code class="language-java">MSLDSDK.action(activity, AccountPath.ROUTE_ACCOUNT_PRIVATE_AGREEMENT, null, new MSLDCallback() {
@Override
public void onSuccess(String s, @Nullable Object o) {
}
@Override
public void onFail(int i, String s, @Nullable Object o) {
}
});</code></pre>
<h5>4.1.24 最佳实践</h5>
<ul>
<li>登录接口调用最佳实践:</li>
</ul>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/bb35b37d5e6c851fddf1ae5547c2e25f?showdoc=.jpg" alt="" /></p>
<h4>4.2 接入支付</h4>
<ul>
<li>MSSDK支付功能提供支付面板和指定支付方式的能力,按需接入。</li>
<li>前置条件:在微服务业务控制台配置游戏商品信息,并在调用支付接口时传入商品标识。</li>
<li>支付功能依赖于用户功能,在用户登录状态下,才能调通支付相关接口。</li>
<li><strong>注意</strong>:客户端发放商品的游戏必须在收到支付成功通知回调(详见本文档4.2.3章节),才能进行发放商品。</li>
</ul>
<h5>4.2.1 支付面板</h5>
<ul>
<li>用户处于登录状态,才能使用支付面板功能。</li>
<li>支付面板提供支付收银台,支付方式的在线控制可联系前线客户支持人员操作。</li>
</ul>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/e821b9540ffa1b862efec790a6c60588?showdoc=.jpg" alt="" /></p>
<ul>
<li>调用示例:</li>
</ul>
<pre><code class="language-java">HashMap<String, Object> map = new HashMap<String, Object>(10);
//支付回调地址,如游戏为客户端发货或使用微服务控制台配置的回调地址,则此处不需要传入。如传入则默认使用该地址
map.put(PaymentParam.PAY_NOTICEURL,"http://*****");
// 商品支付 直接传入价格
map.put(PaymentParam.PAY_PLAYER_ID, "300012345");
map.put(PaymentParam.PAY_MCH_ORDER_NO, "123456");
map.put(PaymentParam.PAY_PRODUCT_DES, "平台支付描述");
map.put(PaymentParam.PAY_SUBJECT, "平台支付订单标题");
map.put(PaymentParam.PAY_PRICE, "6");
map.put(PaymentParam.PAY_ATTACH, "透传信息");
// 平台支付 平台需配置道具文件 可传入多个道具
map.put(PaymentParam.PAY_PLAYER_ID, "300012345");
map.put(PaymentParam.PAY_MCH_ORDER_NO, "123456");
map.put(PaymentParam.PAY_PRODUCT_DES, "平台支付描述");
map.put(PaymentParam.PAY_SUBJECT, "平台支付订单标题");
map.put(PaymentParam.PAY_ATTACH, "透传信息");
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty(PaymentParam.PAY_PRODUCT_ID, "laimo_product");
jsonObject.addProperty(PaymentParam.PAY_QUANTITY, 1);
JsonArray jsonArray = new JsonArray();
jsonArray.add(jsonObject);
map.put(PaymentParam.PAY_PRODUCT_LIST, jsonArray.toString());
MSLDSDK.action(this, PaymentPath.ROUTE_PAY_CHARGE, map, new MSLDPayCallback() {
@Override
public void onComplete() {
show("支付完成");
}
@Override
public void onCancel() {
show("支付取消");
}
@Override
public void onFail(int code, String msg) {
show(msg);
}
});</code></pre>
<ul>
<li><strong>注意</strong>:支付接口的客户端回调仅代表支付动作完成,游戏发货请以支付服务器通知为准,客户端发货的休闲游戏以<strong>支付成功通知回调</strong>为准(详见本文档4.2.3章节)</li>
</ul>
<h5>4.2.2 指定支付方式支付</h5>
<ul>
<li>用户处于登录状态,才能使用指定支付方式功能。</li>
<li>无UI接口,直接调用渠道三方支付界面,当前支持微信和支付宝。</li>
<li>调用示例:</li>
</ul>
<pre><code class="language-java">HashMap<String, Object> map = new HashMap<String, Object>(10);
// 商品支付 直接传入价格
map.put(PaymentParam.PAY_PLAYER_ID, "300012345");
map.put(PaymentParam.PAY_MCH_ORDER_NO, "123456");
map.put(PaymentParam.PAY_PRODUCT_DES, "平台支付描述");
map.put(PaymentParam.PAY_SUBJECT, "平台支付订单标题");
map.put(PaymentParam.PAY_PRICE, "6");
map.put(PaymentParam.PAY_ATTACH, "透传信息");
// 平台支付 平台需配置道具文件 可传入多个道具
map.put(PaymentParam.PAY_PLAYER_ID, "300012345");
map.put(PaymentParam.PAY_MCH_ORDER_NO, "123456");//cp自己的订单号,没有的话可以不传入该字段
map.put(PaymentParam.PAY_PRODUCT_DES, "平台支付描述");
map.put(PaymentParam.PAY_SUBJECT, "平台支付订单标题");
map.put(PaymentParam.PAY_ATTACH, "透传信息");
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty(PaymentParam.PAY_PRODUCT_ID, "game_product");
jsonObject.addProperty(PaymentParam.PAY_QUANTITY, 1);
JsonArray jsonArray = new JsonArray();
jsonArray.add(jsonObject);
map.put(PaymentParam.PAY_PRODUCT_LIST, jsonArray.toString());
// 支付标识,由乐逗微服务控制台分配, 微信支付:wxPay_H5 alipay: aliPay_H5
map.put(PaymentParam.PAY_IDENTIFY, "aliPay_H5");
MSLDSDK.action(this, PaymentPath.ROUTE_PAY_BY_METHOD_ID, map, new MSLDPayCallback() {
@Override
public void onComplete() {
show("支付完成");
}
@Override
public void onCancel() {
show("支付取消");
}
@Override
public void onFail(int code, String msg) {
show(msg);
}
});</code></pre>
<ul>
<li><strong>注意</strong>:支付接口的客户端回调仅代表支付动作完成,游戏发货请以支付服务器通知为准,客户端发货的休闲游戏以<strong>支付成功通知回调</strong>为准(详见本文档4.2.3章节)</li>
</ul>
<h5>4.2.3 监听支付成功通知回调(客户端发放商品必接)</h5>
<ul>
<li>开启订单轮询功能(最佳实践:登陆成功回调后执行)</li>
</ul>
<pre><code class="language-java">MSLDSDK.action(activity, PaymentPath.ROUTE_START_ORDER_POLLIN, new HashMap<String, Object>() {
{
put("playerId", playerId);
}
}, null);</code></pre>
<ul>
<li>停止订单轮询功能(最佳实践:登出回调时执行)</li>
</ul>
<pre><code class="language-java">MSLDSDK.action(activity, PaymentPath.ROUTE_STOP_ORDER_POLLIN, null, null);</code></pre>
<ul>
<li>用户在支付过程可能发生异常情况,支付接口的客户端回调结果并不准确。</li>
<li>MSSDK将服务端可信赖的支付结果,以「支付成功通知回调」形式告知游戏。</li>
<li>游戏需在整个生命周期监听「支付成功通知回调」,及时处理商品发放的业务逻辑,并上报订单消费结果(详见本文档4.2.4章节)。</li>
<li>调用示例:</li>
</ul>
<pre><code class="language-java">MSLDSDK.registerNotifyListener(new MSLDNotifyListener() {
@Override
public void notify(int code, String msg, Object data) {
switch (code) {
case NotifyCode.PAY_SUCCESS:
// 支付成功通知
//返回的data为加密过的字符串,需要解密。解密后为json格式字符串,格式如下:
//{"response":[{"orderNo":"xxxx", "totalAmount":"xx", "attach":"xxxx"}, {...}, ...]}
break;
default:
// 其他
break;
}
}
});</code></pre>
<h5>4.2.4 上报订单消费结果(客户端发放商品必接)</h5>
<ul>
<li>为保证「支付成功通知回调」的安全性和避免重复发货,MSSDK需要游戏上报订单消费结果作为记录。</li>
<li>调用时机:监听到支付成功通知回调(详见详见本文档4.2.3章节)并成功发放商品后</li>
<li>调用示例:</li>
</ul>
<pre><code class="language-java">HashMap<String, Object> params = new HashMap<>();
params.put("orderNo", "DD123456789");
MSLDSDK.action(this, PaymentPath.ROUTE_PAY_REPORT_COMSUMED, params, new MSLDCallback() {
@Override
public void onSuccess(String s, @Nullable Object o) {
Log.i(TAG, "onSuccess: 已发货的结果通知成功 s = " + s);
}
@Override
public void onFail(int i, String s, @Nullable Object o) {
Log.w(TAG, "onFail: 已发货的结果通知成功 i = " + i + "; s = " + s);
}
});</code></pre>
<h5>4.2.5 最佳实践</h5>
<ul>
<li>支付接口调用最佳实践:
<img src="https://www.showdoc.cc/server/api/common/visitfile/sign/18e8c084e4c459b1b50e1a94900139b1?showdoc=.jpg" alt="" /></li>
</ul>
<h4>4.3 接入分享</h4>
<ul>
<li>MSSDK分享功能提供微信和QQ和微博分享能力。</li>
<li>当前版本支持以下分享场景:
<ol>
<li>分享图片到微信会话/微信会话/QQ好友/Qzone/微博</li>
<li>分享链接到微信会话/微信会话/QQ好友/Qzone/微博</li>
<li>分享微信小程序到微信会话</li>
<li>应用打开微信小程序</li>
</ol></li>
</ul>
<h5>4.3.1 QQ分享</h5>
<h6>4.3.1.1 申请QQ参数</h6>
<ul>
<li>在<a href="https://connect.qq.com/index.html">QQ互联平台</a>创建应用并获取QQ AppId,具体联系渠道商务同事。</li>
<li>在MSSDK配置文件msConfig填入QQ AppId,具体请联系技术平台部-SDK开发平台组。</li>
</ul>
<h6>4.3.1.2 配置Androidmanifest.xml</h6>
<ul>
<li>添加权限组件</li>
</ul>
<pre><code class="language-xml"> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /></code></pre>
<ul>
<li>添加activity组件</li>
</ul>
<p>注意:需要将app_Id修改为应用的QQ appId值,例如:<data android:scheme="tencent123456789" /></p>
<pre><code class="language-xml"><activity
android:name="com.tencent.tauth.AuthActivity"
android:launchMode="singleTask"
android:noHistory="true">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!--将app_Id替换成游戏在QQ后台申请的AppId -->
<data android:scheme="tencentapp_Id" />
</intent-filter>
</activity>
<activity
android:name="com.tencent.connect.common.AssistActivity"
android:configChanges="orientation|keyboardHidden"
android:screenOrientation="behind"
android:theme="@android:style/Theme.Translucent.NoTitleBar" /></code></pre>
<h6>4.3.1.3 调用QQ分享功能</h6>
<ul>
<li>分享图片到QQ好友</li>
</ul>
<pre><code class="language-java">HashMap<String, Object> map = new HashMap<String, Object>();
map.put("scene", ShareParam.SHARE_QQ_FRIENDS);
map.put("image", "imagePath");
MSLDSDK.action(this, SharePath.ROUTE_SHARE_IMAGE, map, new MSLDCallback() {
@Override
public void onSuccess(String msg, @Nullable Object data) {
show("分享成功");
}
@Override
public void onFail(int code, String msg, @Nullable Object errorData) {
show("分享失败 " + msg);
}
});</code></pre>
<ul>
<li>分享图片到QZone</li>
</ul>
<pre><code class="language-java">HashMap<String, Object> map = new HashMap<String, Object>();
map.put("scene", ShareParam.SHARE_QQ_QZONE);
map.put("image", "imagePath");
MSLDSDK.action(this, SharePath.ROUTE_SHARE_IMAGE, map, new MSLDCallback() {
@Override
public void onSuccess(String msg, @Nullable Object data) {
show("分享成功");
}
@Override
public void onFail(int code, String msg, @Nullable Object errorData) {
show("分享失败 " + msg);
}
});</code></pre>
<ul>
<li>分享链接到QQ好友</li>
</ul>
<pre><code class="language-java">HashMap<String, Object> map = new HashMap<String, Object>();
map.put("scene", ShareParam.SHARE_QQ_FRIENDS);
map.put("thumbImage", WechatUtils.toHexString(getBytes(file));
map.put("webpageUrl", "要分享的链接");
map.put("title", "链接标题");
map.put("description", "链接描述");
MSLDSDK.action(this, SharePath.ROUTE_SHARE_WEBPAGE, map, new MSLDCallback() {
@Override
public void onSuccess(String msg, @Nullable Object data) {
show("分享成功");
}
@Override
public void onFail(int code, String msg, @Nullable Object errorData) {
show("分享失败 " + msg);
}
});</code></pre>
<ul>
<li>分享链接到QZone</li>
</ul>
<pre><code class="language-java">HashMap<String, Object> map = new HashMap<String, Object>();
map.put("scene", ShareParam.SHARE_QQ_QZONE);
map.put("thumbImage", WechatUtils.toHexString(getBytes(file));
map.put("webpageUrl", "要分享的链接");
map.put("title", "链接标题");
map.put("description", "链接描述");
MSLDSDK.action(this, SharePath.ROUTE_SHARE_WEBPAGE, map, new MSLDCallback() {
@Override
public void onSuccess(String msg, @Nullable Object data) {
show("分享成功");
}
@Override
public void onFail(int code, String msg, @Nullable Object errorData) {
show("分享失败 " + msg);
}
});</code></pre>
<h5>4.3.2 微信分享</h5>
<h6>4.3.2.1 申请微信参数</h6>
<ul>
<li>在 <a href="https://open.weixin.qq.com/">微信开放平台</a> 创建应用并获取微信AppId,具体联系渠道商务同事。</li>
<li>在MSSDK配置文件msConfig.json填入微信AppId,具体请联系 技术平台部-SDK开发平台组。</li>
</ul>
<h6>4.3.2.2 配置WXEntryActivity</h6>
<ul>
<li>先在应用包名目录下新建wxapi目录,再在wxapi目录下新增WXEntryActivity类,并将该类继承自WeixinShareAbstract。</li>
<li>
<p>WXEntryActivity工程配置示例(应用包名为com.idreamsky.hawk):
<img src="https://www.showdoc.cc/server/api/common/visitfile/sign/b3390233a8bb1c55dc766f4428639b0a?showdoc=.jpg" alt="" /></p>
</li>
<li>WXEntryActivity类示例:</li>
</ul>
<pre><code class="language-java">package com.idreamsky.hawk.wxapi;
import com.ms.plugin.wechat.WeixinShareAbstract;
/**
* 微信回调Activity
*/
public class WXEntryActivity extends WeixinShareAbstract {
}</code></pre>
<h6>4.3.2.3 配置Androidmanifest.xml</h6>
<ul>
<li>添加权限组件</li>
</ul>
<pre><code class="language-xml"><uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/></code></pre>
<ul>
<li>添加activity组件</li>
</ul>
<p>注意:将<strong>包名</strong>替换为实际应用包名</p>
<pre><code class="language-xml"> <activity
android:name="包名.wxapi.WXEntryActivity"
android:label="@string/app_name"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:exported="true"
android:taskAffinity="包名"
android:launchMode="singleTask">
</activity></code></pre>
<h6>4.3.2.4 调用微信分享功能</h6>
<ul>
<li>分享图片到微信会话</li>
</ul>
<pre><code class="language-java">HashMap<String, Object> map = new HashMap<String, Object>(2);
map.put("scene", ShareParam.SHARE_WECHAT_SESSION);
map.put("image", "imagePath");
MSLDSDK.action(this, SharePath.ROUTE_SHARE_IMAGE, map, new MSLDCallback() {
@Override
public void onSuccess(String msg, @Nullable Object data) {
show("分享成功");
}
@Override
public void onFail(int code, String msg, @Nullable Object errorData) {
show("分享失败 " + msg);
}
});</code></pre>
<ul>
<li>分享图片到朋友圈</li>
</ul>
<pre><code class="language-java">HashMap<String, Object> map = new HashMap<String, Object>();
map.put("scene", ShareParam.SHARE_WECHAT_TIMELINE);
map.put("image", "imagePath");
MSLDSDK.action(this, SharePath.ROUTE_SHARE_IMAGE, map, new MSLDCallback() {
@Override
public void onSuccess(String msg, @Nullable Object data) {
show("分享成功");
}
@Override
public void onFail(int code, String msg, @Nullable Object errorData) {
show("分享失败 " + msg);
}
});</code></pre>
<ul>
<li>分享链接到微信会话</li>
</ul>
<pre><code class="language-java">HashMap<String, Object> map = new HashMap<String, Object>(5);
map.put("scene", ShareParam.SHARE_WECHAT_SESSION);
map.put("thumbImage", WechatUtils.toHexString(getBytes(file));
map.put("webpageUrl", "要分享的链接");
map.put("title", "链接标题");
map.put("description", "链接描述");
MSLDSDK.action(this, SharePath.ROUTE_SHARE_WEBPAGE, map, new MSLDCallback() {
@Override
public void onSuccess(String msg, @Nullable Object data) {
show("分享成功");
}
@Override
public void onFail(int code, String msg, @Nullable Object errorData) {
show("分享失败 " + msg);
}
});</code></pre>
<ul>
<li>分享链接到朋友圈</li>
</ul>
<pre><code class="language-java">HashMap<String, Object> map = new HashMap<String, Object>(5);
map.put("scene", ShareParam.SHARE_WECHAT_TIMELINE);
map.put("thumbImage", WechatUtils.toHexString(getBytes(file));
map.put("webpageUrl", "要分享的链接");
map.put("title", "链接标题");
map.put("description", "链接描述");
MSLDSDK.action(this, SharePath.ROUTE_SHARE_WEBPAGE, map, new MSLDCallback() {
@Override
public void onSuccess(String msg, @Nullable Object data) {
show("分享成功");
}
@Override
public void onFail(int code, String msg, @Nullable Object errorData) {
show("分享失败 " + msg);
}
});</code></pre>
<ul>
<li>分享微信小程序到微信会话</li>
</ul>
<ol>
<li>参数申请:在<a href="https://mp.weixin.qq.com/">微信公众平台</a>注册小程序并获取小程序原始id,具体联系渠道商务或技术中台-微信组。</li>
<li>注意事项:在<a href="https://open.weixin.qq.com/">微信开放平台</a>,将应用所属的微信开发平台帐号绑定小程序,具体联系渠道商务或技术中台-微信组。</li>
<li>调用示例:</li>
</ol>
<pre><code class="language-java">HashMap<String, Object> map = new HashMap<String, Object>(5);
map.put("userName", "微信小程序原始ID");
map.put("path", "pages/index");
map.put("miniprogramType", "0");
map.put("thumbImage", WechatUtils.toHexString(getBytes(file));
map.put("webpageUrl", "分享的链接");
map.put("title", "链接标题");
map.put("description", "链接描述");
map.put("withShareTicket", "0");
MSLDSDK.action(this, SharePath.ROUTE_SHARE_MINI_PROGRAM, map, new MSLDCallback() {
@Override
public void onSuccess(String msg, @Nullable Object data) {
show("分享成功");
}
@Override
public void onFail(int code, String msg, @Nullable Object errorData) {
show("分享失败 " + msg);
}
});</code></pre>
<ul>
<li>应用打开微信小程序</li>
</ul>
<ol>
<li>参数申请:在<a href="https://mp.weixin.qq.com/">微信公众平台</a>注册小程序并获取小程序原始id,具体联系渠道商务或技术中台-微信组。</li>
<li>注意事项:在<a href="https://open.weixin.qq.com/">微信开放平台</a>将应用所属的微信开发平台帐号绑定小程序,具体联系渠道商务或技术中台-微信组。</li>
<li>调用示例:</li>
</ol>
<pre><code class="language-java">HashMap<String, Object> map = new HashMap<String, Object>(2);
map.put("userName", "微信小程序原始ID");
map.put("path", "pages/index");
map.put("miniprogramType", "0");
MSLDSDK.action(this, SharePath.ROUTE_SHARE_LAUNCH_MINI_PROGRAM, map,null);</code></pre>
<h5>4.3.3 微博分享</h5>
<ul>
<li>请APP_KEY </li>
<li>第三方需要接入微博SDK必须在微博开放平台上对应用进行注册,并获取APP_KEY,添加</li>
<li>应用的授权回调页面(Redirect URI),详情请参考:微博移动接入平台 </li>
<li>注册程序包名和签名</li>
<li>集成SDK前,需要在微博开放平台上注册应⽤用的包名和签名。 注意:包名和签名未注册,或者编译运⾏行行时的签名和注册签名不不⼀一致都可能导致⽆无法授权</li>
<li>(debug运⾏行行apk和发布时的apk)。</li>
</ul>
<pre><code class="language-xml"> <meta-data
android:name="WEIBO_APPKEY"
android:value="2045436852" />
<meta-data
android:name="WEIBO_CHANNEL"
android:value="weibo" /></code></pre>
<ul>
<li>
<p>权限</p>
<pre><code class="language-xml"><uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /></code></pre>
</li>
<li>
<p>接入方式
全新的SDK已经上传到中央仓库
这里按照Android studio为例子,在项目根目录的build.gradle中设置中央仓库
maven { url "<a href="https://dl.bintray.com/thelasterstar/maven/">https://dl.bintray.com/thelasterstar/maven/</a>" } 在需要引入SDK的module目录的build.gradle中引入sdk-core依赖 dependencies {
compile 'com.sina.weibo.sdk:core:2.0.3:openDefaultRelease@aar' }</p>
</li>
<li>分享图片</li>
</ul>
<pre><code class="language-java">HashMap<String, Object> map = new HashMap<String, Object>();
map.put("scene", ShareParam.SHARE_WEIBO);
map.put("image", "imagePath");
MSLDSDK.action(this, SharePath.ROUTE_SHARE_IMAGE, map, new MSLDCallback() {
@Override
public void onSuccess(String msg, @Nullable Object data) {
show("分享成功");
}
@Override
public void onFail(int code, String msg, @Nullable Object errorData) {
show("分享失败 " + msg);
}
});</code></pre>
<ul>
<li>分享链接</li>
</ul>
<pre><code class="language-java">HashMap<String, Object> map = new HashMap<String, Object>();
map.put("scene", ShareParam.SHARE_WEIBO);
map.put("thumbImage", WechatUtils.toHexString(getBytes(file));
map.put("webpageUrl", "要分享的链接");
map.put("title", "链接标题");
map.put("description", "链接描述");
MSLDSDK.action(this, SharePath.ROUTE_SHARE_WEBPAGE, map, new MSLDCallback() {
@Override
public void onSuccess(String msg, @Nullable Object data) {
show("分享成功");
}
@Override
public void onFail(int code, String msg, @Nullable Object errorData) {
show("分享失败 " + msg);
}
});</code></pre>
<h4>4.4 上报游戏数据(DLOG SDK)</h4>
<ul>
<li>MSSDK已集成DLOG SDK数据统计能力,游戏可以上报各项数据,并支持可视化数据报表。</li>
<li>数据上报功能依赖于用户功能,必须先接入用户功能才能使用。</li>
<li>调用示例:</li>
</ul>
<pre><code class="language-java">//游戏加载时长
MSLDSDK.action.action(getContext(), DlogPath.ROUTE_DLOG_LOADING_COMPLETED_EVENT, new HashMap<String, Object>() {
{
put("loadingTime", 10);
}}, null);
//自定义事件流水
MSLDSDK.action.action(getContext(), DlogPath.ROUTE_DLOG_CUSTOM_EVENT, new HashMap<String, Object>() {
{
put("EventId", "event_id_10009000");
put("EventParam", "register");
put("EventParamValue", "1");
put("extStr1", "other_value");
}}, null);</code></pre>
<p><strong>更多关于DLog的使用,可以参考 <a href="https://www.showdoc.cc/mssdk?page_id=2701294611171044">数据统计</a> API文档。</strong></p>
<h4>4.5 其他</h4>
<h5>4.5.1 获取配置信息(选接)</h5>
<ul>
<li>获取MSSDK配置信息,MSLDConfig 暂时只有一个字段isTrial,即 是否提审模式</li>
<li>调用示例:</li>
</ul>
<pre><code class="language-java">MSLDConfig config = MSLDSDK.<MSLDConfig>syncAction(activity, SdkPath.ROUTE_SDK_CONFIG, null);</code></pre>
<h4>4.6 接入极光一键登录</h4>
<ul>
<li>需要接入极光一键登录,请查看 <a href="https://www.showdoc.cc/mssdk?page_id=2639446040148972">Android SDK一键登录集成文档</a></li>
</ul>
<h4>4.7 接入乐变热更</h4>
<ul>
<li>需要接入乐变热更,请查看 <a href="https://www.showdoc.cc/mssdk?page_id=2639271553784040">Android 热更新集成文档</a></li>
</ul>
<h4>4.8 问卷调查</h4>
<ul>
<li>问卷调查功能目前使用<a href="https://www.wjx.cn/" title="【问卷星】">【问卷星】</a></li>
</ul>
<h5>4.8.1 问卷调查是否可用</h5>
<ul>
<li>获取当前问卷调查功能是否可用 (需要在微服务业务后台配置:问卷开关和问卷地址链接)</li>
<li>调用示例:</li>
</ul>
<pre><code class="language-java">//返回值isEnable是boolean类型
Object isEnable = MSLDSDK.syncAction(activity, QuestionnairePath.ROUTE_QUESTIONNAIRE_ISENABLE, null);</code></pre>
<h5>4.8.2 打开问卷调查页面</h5>
<ul>
<li>打开问卷调查页面</li>
<li>调用示例:</li>
</ul>
<pre><code class="language-java">MSLDSDK.action(activity, QuestionnairePath.ROUTE_QUESTIONNAIRE_OPEN, new HashMap<String, Object>() {
{
put(QuestionnaireParam.KEY_PLAYER_ID, "用户ID");
put(QuestionnaireParam.KEY_SERVER_ID, "区服ID");
put(QuestionnaireParam.KEY_ROLE_ID, "角色ID");
put(QuestionnaireParam.KEY_LEVEL, "等级");
put(QuestionnaireParam.KEY_ACCRUING_AMOUNTS, "累计金额");
put(QuestionnaireParam.KEY_CONSECUTIVE_DAYS, "连续登陆天数");
put(QuestionnaireParam.KEY_EXTRA, "扩展参数");
put(QuestionnaireParam.KEY_URL, "问卷地址");
}
}, new MSLDCallback() {
@Override
public void onSuccess(String msg, Object data) {
}
@Override
public void onFail(int code, String msg, Object errorData) {
}
});</code></pre>
<p><strong>这里特别注意</strong>:如果开发者需要自己在特殊场景下弹出不同的问卷内容,可以通过传入 <code>url</code> 值来进行控制,但是如果客户端传入了此值,问卷调查将优先使用传入的值作为问卷地址展示给用户。如果此值为空,则使用后台配置的默认问卷地址。
<strong>如果想使用 <code>url</code> 字段,需要升级MSSDK到1.4.2版本。</strong></p>
<p>另外,问卷星支持客户端通知开发者客户端,也支持MSSDK服务端通知开发者服务端,具体可以参考 <a href="https://www.showdoc.cc/mssdk?page_id=3169583440854192">问卷星服务端接入</a> 文档。</p>
<h4>5.广告追踪</h4>
<h5>5.1.登录上报</h5>
<p><strong>简要描述</strong>
上报登录事件(生命周期内只上报一次登录)</p>
<pre><code class="language-java">MSLDSDK.action(activity, "advertisement/login", new HashMap<String, Object>() {
{
put("playerId", "22222333322323");
}
}, new MSLDCallback() {
@Override
public void onSuccess(String s, @Nullable Object o) {
}
@Override
public void onFail(int i, String s, @Nullable Object o) {
}
});</code></pre>
<h5>5.2.消费上报</h5>
<p><strong>简要描述</strong>
上报消费、购买事件</p>
<p><strong>示例:</strong></p>
<pre><code class="language-java">MSLDSDK.action(activity, "advertisement/purchase", new HashMap<String, Object>() {
{
put("playerId", 1123);
put("amount", 11.0f);
}
}, new MSLDCallback() {
@Override
public void onSuccess(String s, @Nullable Object o) {
}
@Override
public void onFail(int i, String s, @Nullable Object o) {
}
});</code></pre>
<h5>5.3.自定义上报</h5>
<p><strong>简要描述</strong>
上报自定义事件</p>
<p><strong>示例:</strong></p>
<pre><code class="language-java">MSLDSDK.action(activity, "advertisement/customevent", new HashMap<String, Object>() {
{
put("leveldown","{"user_id":"123321","level":"22"}");
}
}, new MSLDCallback() {
@Override
public void onSuccess(String s, @Nullable Object o) {
}
@Override
public void onFail(int i, String s, @Nullable Object o) {
}
});</code></pre>
<h5>5.4.广告点击事件上报</h5>
<p><strong>简要描述</strong>
上报广告的点击事件</p>
<p><strong>示例:</strong></p>
<pre><code class="language-java">MSLDSDK.action(activity, "advertisement/adclick", new HashMap<String, Object>() {
{
put("platformType", "1");
put("displayType", "1");
}
}, new MSLDCallback() {
@Override
public void onSuccess(String s, @Nullable Object o) {
}
@Override
public void onFail(int i, String s, @Nullable Object o) {
}
});</code></pre>
<h4>6.获取微信昵称和头像</h4>
<p><strong>简要描述</strong>
获取微信昵称和头像,微信授权成功并同步完信息后会返回新的MSLDAccount对象</p>
<p><strong>示例:</strong></p>
<pre><code class="language-java">MSLDSDK.action(activity, AccountPath.ROUTE_ACCOUNT_DIRECT_SYNC_WECHAT_INFO, null, new MSLDCallback() {
@Override
public void onSuccess(String msg, @Nullable Object data) {
Log.i(TAG, " ==> success : " + msg);
if (null!=data && data instanceof MSLDAccount) {
MSLDAccount account = (MSLDAccount) data;
Log.i(TAG, "nickName " + account.nickName + " headImage:"+account.avatarUrl);
}
}
@Override
public void onFail(int code, String msg, @Nullable Object errorData) {
Log.i(TAG, "==> onFail " +code +": "+msg);
}
});</code></pre>
<h4>7.LBS</h4>
<h5>7.1 获取位置授权</h5>
<p><strong>简要描述</strong>
此接口为获取位置权限
<strong>注意:从SDK1.9.0版本开始,初始化时不再申请位置权限,如果需要位置权限请调用此授权接口,或者游戏业务自己单独处理</strong></p>
<p><strong>示例:</strong></p>
<pre><code class="language-java">HashMap<String, Object> map0 = new HashMap<>();
map0.put(LbsParam.IS_SHOW_SETTING_TIP, "1");
MSLDSDK.action(activity,LbsPath.ROUTE_LBS_REQUEST_LOCATION_PERMISSIONS, map0, new MSLDCallback() {
@Override
public void onSuccess(String msg, @Nullable Object data) {
Log.i(TAG, "requestPermission() ==> success : " +msg + " "+ data);
tvResult.setText(msg);
}
@Override
public void onFail(int code, String msg, @Nullable Object data) {
Log.i(TAG, "requestPermission() ==> onFail " + code + ": " + msg);
tvResult.setText("code:" + code + "msg:" + msg);
}
});</code></pre>
<h5>7.2 获取位置授权获取附近的用户列表</h5>
<p><strong>简要描述</strong>
获取附近玩家用户列表,此功能依赖定位权限</p>
<blockquote>
<p>注意: 1. 附近的人记录限制100条; 2. 默认缓存时间10分钟</p>
</blockquote>
<p><strong>示例:</strong></p>
<pre><code class="language-java">HashMap params = new HashMap<String, Object>(2);
params.put(LbsParam.KEY_SORT, "desc");
params.put(LbsParam.KEY_PAGESIZE, 50);
params.put(LbsParam.KEY_RADIUS, 15);
params.put(LbsParam.KEY_PAGEINDEX, 0);
MSLDSDK.action(activity, LbsPath.ROUTE_LBS_SEARCHNEARBY, params, new MSLDCallback() {
@Override
public void onSuccess(String msg, @Nullable Object data) {
Log.i(TAG, "getNearby() ==> success : " + msg);
tvResult.setText(data.toString());
}
@Override
public void onFail(int code ,String msg, @Nullable Object data) {
Log.i(TAG, "getNearby() ==> onFail " +code +": "+msg);
tvResult.setText(msg);
}
});</code></pre>
<h5>7.3 获取当前位置信息</h5>
<p><strong>简要描述</strong>
此接口返回当前位置相关信息,主要包含经纬度和具体详细的位置信息
<strong>示例</strong></p>
<pre><code> MSLDSDK.action(activity, LbsPath.ROUTE_LBS_GETCURRENTLOCATION, null, new MSLDCallback() {
@Override
public void onSuccess(String msg, @Nullable Object data) {
Log.i(TAG, "startLocation() ==> success : " + data);
if (null != data && data instanceof MsLocation) {
MsLocation msLocation = (MsLocation) data;
tvResult.setText(msLocation.toString());
}
}
@Override
public void onFail(int code, String msg, @Nullable Object data) {
Log.i(TAG, "startLocation() ==> onFail " + code + ": " + msg);
if (code == -17001){
Log.i(TAG, "授权被拒绝 " + code + ": " + msg);
}
tvResult.setText("code:" + code + "msg:" + msg);
}
});</code></pre>
<h4>8.推送</h4>
<h5>8.1.获取RegistrationID</h5>
<p><strong>简要描述</strong>
集成了 JPush SDK 的应用程序在第一次成功注册到 JPush 服务器时,JPush 服务器会给客户端返回一个唯一的该设备的标识</p>
<p><strong>示例:</strong></p>
<pre><code class="language-java">//返回值registrationId是String类型
Object registrationId = MSLDSDK.syncAction(activity, PushPath.ROUTE_GET_REGISTRATIONID, null);</code></pre>
<h5>8.2.设置别名 alias</h5>
<p><strong>简要描述</strong>
为安装了应用程序的用户,取个别名来标识。以后给该用户 Push 消息时,就可以用此别名来指定。每个用户只能指定一个别名。</p>
<p><strong>示例:</strong></p>
<pre><code class="language-java">MSLDSDK.action(activity, PushPath.ROUTE_SET_ALIAS, new HashMap<String, Object>() {
{
put("alias", alias);
}
}, new MSLDCallback() {
@Override
public void onSuccess(String s, @Nullable Object o) {
}
@Override
public void onFail(int i, String s, @Nullable Object o) {
}
});</code></pre>
<h4>9.兑换码</h4>
<h5>9.1.唤起兑换码界面</h5>
<p><strong>简要描述</strong>
兑换码UI</p>
<p><strong>示例:</strong></p>
<pre><code class="language-java">MSLDSDK.action(activity, RedeemCodePath.ROUTE_SHOW_REDEEMCODE, null, new MSLDCallback() {
@Override
public void onSuccess(String msg, @Nullable Object data) {
//执行成功回调返回productId,就是data,字符串String类型
}
@Override
public void onFail(int code, String msg, @Nullable Object errorData) {
}
});</code></pre>
<p><strong>回调参数说明:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">参数名</th>
<th style="text-align: left;">类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">code</td>
<td style="text-align: left;">int</td>
<td>错误码</td>
</tr>
<tr>
<td style="text-align: left;">msg</td>
<td style="text-align: left;">String</td>
<td>状态详情</td>
</tr>
<tr>
<td style="text-align: left;">errorData</td>
<td style="text-align: left;">Object</td>
<td>返回对象</td>
</tr>
<tr>
<td style="text-align: left;">data</td>
<td style="text-align: left;">String</td>
<td>道具标识productId</td>
</tr>
</tbody>
</table>
<h5>9.2.调用兑换码接口(无UI)</h5>
<p><strong>简要描述</strong>
兑换码无UI</p>
<p><strong>示例:</strong></p>
<pre><code class="language-java">MSLDSDK.action(activity,RedeemCodePath.ROUTE_REDEEMCODE,
new HashMap<String, Object>() {
{
put("code", text);
}
}, new MSLDCallback() {
@Override
public void onSuccess(String msg, @Nullable Object data) {
//执行成功回调返回productId,就是data,字符串String类型
}
@Override
public void onFail(int code, String msg, @Nullable Object errorData) {
}
});</code></pre>
<p><strong>回调参数说明:</strong></p>
<table>
<thead>
<tr>
<th style="text-align: left;">参数名</th>
<th style="text-align: left;">类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">code</td>
<td style="text-align: left;">int</td>
<td>错误码</td>
</tr>
<tr>
<td style="text-align: left;">msg</td>
<td style="text-align: left;">String</td>
<td>状态详情</td>
</tr>
<tr>
<td style="text-align: left;">errorData</td>
<td style="text-align: left;">Object</td>
<td>返回对象</td>
</tr>
<tr>
<td style="text-align: left;">data</td>
<td style="text-align: left;">String</td>
<td>道具标识productId</td>
</tr>
</tbody>
</table>
<h4>10.关系链</h4>
<h5>10.1.获取联系人权限</h5>
<p><strong>简要描述:</strong>
此接口为获取用户联系人列表的权限</p>
<p><strong>示例</strong></p>
<pre><code> HashMap<String, Object> map0 = new HashMap<>();
// 是否强制授权("1"是,"0"否),强制授权会弹二次确认框
map0.put(ContactsParam.IS_SHOW_CONFIRM_DIALOG, "1");
MSLDSDK.action(activity,ContactsPath.ROUTE_CONTACT_PERMISSIONS, map0, new MSLDCallback() {
@Override
public void onSuccess(String msg, @Nullable Object data) {
Log.i(TAG, "requestPermission() ==> success : " + data);
}
@Override
public void onFail(int code, String msg, @Nullable Object data) {
Log.i(TAG, "requestPermission() ==> onFail " + code + ": " + msg);
if (code == -18001){
Log.i(TAG, "授权被拒绝 " + code + ": " + msg);
}
tvResult.setText("code:" + code + "msg:" + msg);
}
});</code></pre>
<h5>10.2.获取平台级好友列表</h5>
<p><strong>简要描述:</strong>
此接口为获取平台级好友列表</p>
<p><strong>示例</strong></p>
<pre><code>MSLDSDK.action(activity, ContactsPath.ROUTE_CONTACT_PLATFORM_FRIENDLIST, null, new MSLDCallback() {
@Override
public void onSuccess(String msg, @Nullable Object data) {
Log.i(TAG, "getContactsFireds() ==> success : " + data);
}
@Override
public void onFail(int code, String msg, @Nullable Object data) {
Log.i(TAG, "getContactsFireds() ==> onFail " + code + ": " + msg);
tvResult.setText("code:" + code + "msg:" + msg);
}
});</code></pre>
<h4>11.openinstall</h4>
<h5>10.1.主动获取落地页参数</h5>
<p><strong>简要描述:</strong>
主动获取落地页参数</p>
<p><strong>示例</strong></p>
<pre><code>
MSLDSDK.action(activity, OpenInstallPath.ROUTE_GETINSTALL, null,
new MSLDCallback<MsldOpeninstallData>() {
@Override
public void onSuccess(String msg, MsldOpeninstallData data) {
}
@Override
public void onFail(int code, String msg, Object o) {
}
});
</code></pre>
<h5>10.2.openinstall渠道效果统计</h5>
<p><strong>简要描述:</strong>
openinstall渠道效果统计</p>
<p><strong>示例</strong></p>
<pre><code> HashMap<String, Object> map0 = new HashMap<>();
map0.put(OpenInstallParam.POINTID, "pointId");
map0.put(OpenInstallParam.POINTVALUE, "pointValue");
MSLDSDK.action(activity, OpenInstallPath.ROUTE_REPORTEFFECTPOINT,map0, new MSLDCallback<MsldOpeninstallData>() {
@Override
public void onSuccess(String msg, MsldOpeninstallData data) {
}
@Override
public void onFail(int code, String msg, Object o) {
}
});
</code></pre>
<h5>10.3.openinstall注册量统计</h5>
<p><strong>简要描述:</strong>
openinstall注册量统计</p>
<p><strong>示例</strong></p>
<pre><code>MSLDSDK.action(activity, OpenInstallPath.ROUTE_REPORTREGISTER, null,
new MSLDCallback() {
@Override
public void onSuccess(String msg, Obejcg data) {
}
@Override
public void onFail(int code, String msg, Object o) {
}
});
</code></pre>