在客户端接入华为登陆和华为支付
一、 集成 SDK
下载SDK
包括两个:HMS Agent(下载 .zip 文件,后面需要进行自定义处理)和 HMS SDK(提供:Gradle 依赖或下载 .jar 文件)。
注意:使用的HMS SDK Agent的主版本号必须与HMS SDK相同。例如HMS SDK Agent 2.6.3.301,2.6.3即为主版本号。
下载 SDK
HMS SDK 使用 Gradle 依赖方式
配置仓库,在工程的 build.gradle 文件如下位置添加:
allprojects {
repositories {
jcenter()
maven {url 'http://developer.huawei.com/repo/'}
}
}
在模块 build.gradle 文件中添加如下依赖:
String HMSSDKVer = '2.6.3.301'
implementation 'com.huawei.android.hms:hwid:'+ HMSSDKVer // 登陆
implementation 'com.huawei.android.hms:iap:' + HMSSDKVer // 支付
注意:版本号要同 Agent 保持一致
集成 Agent
在1.1中下载的 Agent 包,解压缩,根据实际情况运行其中的脚本。执行下面操作的前提是 appid 已经申请下来。
首先进入 HMSAgent_2.6.3.301/ 目录,在命令行运行脚本:
// 在Mac下执行,为了避免换行符的问题需要先执行下
cat GetHMSAgent_cn.sh | tr "^M" "\n" > GetHMSAgent_cn_new.sh
// 注意 ^M是通过:Ctrl+v 、Ctrl+M 输入得到的,复制或输入^M无效
// 接着修改下文件权限
chmod 777 GetHMSAgent_cn_new.sh
// 执行文件
./GetHMSAgent_cn_new.sh
接下来就按提示根据实际情况进行输入和选择。
看到输出提示“按回车键结束”后,可以看到在脚本所在目录中看到目录copysrc,将AppManifestConfig.xml中的内容添加到工程的 AndroidManifest.xml文件中,将 java/目录中的 com/ 目录整体拷贝到工程中。
到此添加集成 SDK 完成。
二、接入
调用 init 接口,在 Application 的 onCreate 方法中初始化 HMSAgent。
HMSAgent.init(this);
调用 connect 接口
HMSAgent.connect(this, new ConnectHandler() {
@Override
public void onConnect(int rst) {
LogUtil.d("huawei connect:" + rst);
}
});
注意:必须在应用启动后就调用该接口
调用checkUpdate接口
调用该接口,当华为市场上传了新版本,那么将出现升级新版本的提示框,用户确认后,将自动下载安装新版本。
HMSAgent.checkUpdate(this, new CheckUpdateHandler() {
@Override
public void onResult(int rst) {
LogUtil.d("huawei checkUpdate:" + rst);
}
});
注意:该方法也必须在应用启动时调用,否则会影响审核。
调用登录方法
HMSAgent.Hwid.signIn(true, new SignInHandler() {
@Override
public void onResult(int rst, SignInHuaweiId result) {
// 打印返回码
LogUtil.d("huawei sign resutlCode: " + rst);
if (rst == HMSAgent.AgentResultCode.HMSAGENT_SUCCESS && null != result) {
// 打印用户信息
LogUtil.d("userInfo = " + result.toString());
} else {
// 提示登录失败码
ToastUtil.show(LoginActivity.this, rst);
}
}
});
调用支付方法
// payReq 支付请求类实例,最好是服务器端给到这些数据
HMSAgent.Pay.pay(payReq, new PayHandler() {
@Override
public void onResult(int retCode, PayResultInfo payInfo) {
if (retCode == HMSAgent.AgentResultCode.HMSAGENT_SUCCESS && payInfo != null) {
// 此处如果是本地处理逻辑的话需要校验签名是否正确,如果是服务器处理的话就是成功支付后的逻辑
} else if (retCode == HMSAgent.AgentResultCode.ON_ACTIVITY_RESULT_ERROR
|| retCode == PayStatusCodes.PAY_STATE_TIME_OUT
|| retCode == PayStatusCodes.PAY_STATE_NET_ERROR) {
// 需要重新获取订单状态
} else {
ToastUtil.show(context, "支付失败, code = " + retCode);
}
}
});
三、集成、接入中遇到的问题
脚本执行的时候遇到问题:
a) 执行脚本后无反应
b) 提示:exec format error
c) 提示:parse error near 'elif'
解决办法:上面集成 Agent 中已给出解决办法。
一开始 HMS Agent 同 HMS SDK 版本不一致,导致初始化失败,提示-1000。