文档管理中心

此版本文档已归档不再维护,推荐您使用最新版本

 

指南钱包服务应用开发开发场景介绍添加卡劵APP应用集成WalletKit SDK后推送JWE数据到华为服务器

App应用集成Wallet Kit SDK后推送JWE数据到华为服务器

1 集成HMS SDK

1.1 在Android Studio项目中集成HMS SDK

针对AndroidStudio开发环境,华为提供了maven仓集成方式的WalletKit SDK包。在开始开发前,您需要将WalletKit SDK集成到您的AndroidStudio开发环境中:

  • AndroidStudio开发环境中添加当前应用的AppGallery Connect配置文件。

  • 配置HMS SDKmaven仓地址。

  • 添加编译依赖。

1.1.1 在AndroidStudio开发环境中添加当前应用的AppGallery Connect配置文件

步骤1:登录 AppGallery Connect 网站,选择“我的应用”。

步骤2:在名称列表中找到应用所在的产品,点击对应的“Android应用”链接。

步骤3:选择“开发 > 概览”。

步骤4:单击“应用”栏下的“agconnect-service.json”下载配置文件。

步骤5:将agconnect-service.json文件拷贝到项目级根目录下。

----结束

1.1.2 配置HMS SDK的maven仓地址

步骤1:打开AndroidStudio项目级build.gradle文件。

步骤2:在allprojects ->repositories里面配置HMS SDK的maven仓地址。

收起
自动换行
深色代码主题
复制
  1. allprojects {
  2. repositories {
  3. google()
  4. jcenter()
  5. maven {url 'https://developer.huawei.com/repo/'}
  6. }
  7. }

步骤3:buildscript->repositories中配置HMS SDKmaven仓地址。

收起
自动换行
深色代码主题
复制
  1. buildscript {
  2. repositories {
  3. google()
  4. jcenter()
  5. maven {url 'https://developer.huawei.com/repo/'}
  6. }
  7. }

步骤4:在buildscript -> dependencies里面增加配置。

收起
自动换行
深色代码主题
复制
  1. buildscript {
  2. dependencies {
  3.   classpath 'com.huawei.agconnect:agcp:1.2.1.301'
  4. }
  5. }

*注:maven仓地址直接在浏览器中打开无法访问,只能在IDE中配置。

----结束


1.1.3 添加编译依赖

步骤1:打开应用级的build.gradle文件。

步骤2:在“dependencies” 中添加如下编译依赖。

收起
自动换行
深色代码主题
复制
  1. dependencies {
  2. implementation 'com.huawei.hms:wallet:{version}'
  3. }

*注:{version} 替换为实际的SDK版本号,如:implementation 'com.huawei.hms:wallet:4.0.2.300'。

步骤3:在文件头添加配置。

收起
自动换行
深色代码主题
复制
  1. apply plugin: 'com.huawei.agconnect'

----结束

1.1.4 Sync Now

重新打开修改完的“build.gradle”文件,右上方出现“Sync Now”链接。单击“Sync Now”等待同步完成。


如果出现错误,请检查网络连接是否正常,以及检查gradle文件是否正确。

 1.1.5 多语言设置

  • 如果您的应用不需要设置只支持某些特定语言,则请忽略本步骤。应用将默认支持所有HMS SDK支持的语言。

  • 如果您的应用需要设置只支持某些特定语言,则可通过本步骤配置。

打开应用级根目录的“build.gradle”文件。

在“android>defaultConfig”中新增“resConfigs”配置,“en”(英语) zh-rCN”(简体中文)为必须配置的语种,配置格式如下:

收起
自动换行
深色代码主题
复制
  1. android {
  2. defaultConfig {
  3. ...
  4. resConfigs "en", "zh-rCN", "需要支持的其他语言"
  5. }
  6. }

HMS SDK支持的语言列表请参考HMS SDK支持的语言

1.2 在Eclipse项目中集成HMS SDK

针对Eclipse开发环境,华为提供了下载HMS SDK包本地集成的方式。在开始开发前,您需要将HMS SDK集成到您的Eclipse开发环境中。

1.2.1 下载HMS SDK

步骤1:下载HMS Base SDK和WalletKit SDK,并解压zip包。

下载地址请参见:Eclipse SDK下载

步骤2:将所有SDK工程导入到您的工作空间。

  • 选择菜单“File > Import”,再选择“Android > Existing Android Code Into Workspace”,单击“Next”。

  • 单击“Browse”,选择工程所在的文件夹。在“Projects”下显示待导入的工程,默认全部勾选,单击“Finish”。

*注:待导入的工程必须和工作空间在相同的磁盘空间里,例如都在“D:\”。如果不在,您可以选择“Copy projects into workspace”,将工程文件复制到工作空间。

步骤3:将WalletKit SDK的jar文件导入您的工作空间中。

  • 在您的工作空间新建libs目录,并将WalletKit SDK放入libs目录中。

  • 右键您的工程选中Build Path-->Add Libraries,选中User Library

  • 新建User Library名称。

  • 点击Add JARs...,并选中之前导入libs下的jar文件。

  • 点击Finish即完成了WalletKit SDKjar文件导入。

----结束

1.2.2 添加工程依赖关系

步骤1:右键单击您的工程,选择“Properties”。

步骤2:在左侧选择“Android”,单击“Add”,选择已导入空间的工程,单击“Apply and Close”。

步骤3:由于Eclipsexml文件不支持$符号,将HMSSdkBaseAgconnect-core工程下AndroidManifest.xml文件中的“${applicationId}”替换成您的应用包名。

收起
自动换行
深色代码主题
复制
  1. <application>
  2. <provider
  3. android:name="com.huawei.agconnect.core.provider.AGConnectInitializeProvider"
  4. android:authorities="${applicationId}.AGCInitializeProvider"
  5. android:exported="false" />
  6. <service
  7. android:name="com.huawei.agconnect.core.ServiceDiscovery"
  8. android:exported="false" />
  9. </application>

----结束

1.2.3 拷贝HMSSdkBase资源文件到您的工程目录

HMSSdkBase工程中assets目录下的资源文件拷贝到您的工程中assets目录下。

*注:如果依赖其他的kit资源,还需要复制对应kit的资源文件到您的工程目录下。

1.2.4 在商户工程的project.properties中加入manifestmerger.enabled=true

2 配置混淆脚本

开发者编译APK前需要配置不要混淆HMS SDK,避免功能异常。

步骤1:打开Android工程的混淆配置文件。

步骤2:加入排除HMS SDK的混淆配置。

收起
自动换行
深色代码主题
复制
  1. -ignorewarning
  2. -keepattributes *Annotation*
  3. -keepattributes Exceptions
  4. -keepattributes InnerClasses
  5. -keepattributes Signature
  6. -keepattributes SourceFile,LineNumberTable
  7. -keep class com.hianalytics.android.**{*;}
  8. -keep class com.huawei.updatesdk.**{*;}
  9. -keep class com.huawei.hms.**{*;}

步骤3:如果开发者使用了AndResGuard,需要在混淆配置文件中加入AndResGuard允许清单

收起
自动换行
深色代码主题
复制
  1. "R.string.hms*",
  2. "R.string.connect_server_fail_prompt_toast",
  3. "R.string.getting_message_fail_prompt_toast",
  4. "R.string.no_available_network_prompt_toast",
  5. "R.string.third_app_*",
  6. "R.string.upsdk_*",
  7. "R.layout.hms*",
  8. "R.layout.upsdk_*",
  9. "R.drawable.upsdk*",
  10. "R.color.upsdk*",
  11. "R.dimen.upsdk*",
  12. "R.style.upsdk*"

----结束

3 通过SDK添加会员卡代码样例

步骤1:创建你的会员卡对象。

具体设置项请见开发者API文档,示例代码不一一列举:

注:生成用户特有信息的实例前请先将模板推送至华为服务器,并在用户特有信息的实例中传入模板唯一标识PassStyleIdentifier。

收起
自动换行
深色代码主题
复制
  1. PassObject.Builder passBuilder = PassObject.getBuilder();
  2. passBuilder.setStatus(status)
  3. .setOrganizationPassId(cardNumber)
  4. .setPassStyleIdentifier(mPassStyleIdentifier.getText().toString())
  5. .setPassTypeIdentifier(typeId)
  6. .setSerialNumber(serinumber)
  7. .addAppendFields(appendFields)
  8. .addCommonFields(commonField)
  9. .passBuilder.addLocationList(locationList)
  10. .addImageList(imageList)
  11. //生成会员卡对象
  12. PassObject passObject = passBuilder.build();

步骤2:将对象转化为JWE。

开发者需要在自己后台服务器提供将会员卡对象JSON转化为JWE格式的功能,具体实现样例代码如下:

收起
自动换行
深色代码主题
复制
  1. // 在华为AppGallery Connect网站上注册的应用ID。
  2. String appId = "Replace with your app ID";
  3. //生成一个新的实例并将其绑定到用户
  4. String newInstanceJson = passObject.toJson();
  5. JSONObject newInstanceJsonObject = JSONObject.parseObject(newInstanceJson);
  6. newInstanceJsonObject.put("iss", appId);
  7. //生成会话密钥以加密有效载荷数据。 会话密钥是一串随机的十六进制数字。
  8. String sessionKey = RandomUtils.generateSecureRandomFactor(16);
  9. System.out.println("sessionKey: " + sessionKey);
  10. //华为固定的公开密钥,用于加密会话密钥。
  11. String sessionKeyPublicKey =     "MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAgBJB4usbO33Xg5vhJqfHJsMZj44f7rxpjRuPhGy37bUBjSLXN+dS6HpxnZwSVJCtmiydjl3Inq3Mzu4SCGxfb9RIjqRRfHA7ab5p3JnJVQfTEHMHy8XcABl6EPYIJMh26kztPOKU2Mkn6yhRaCurhVUD3n9bD8omiNrR4rg442AJlNamA7vgKs65AoqBuU4NBkGHg0VWWpEHCUx/xyX6hIwqc1aD7P2f62ZHsKpNZBOek/riWhaVx3dTAa9ZS+Av3IGLOZiplhYIow9f8dlWyqs8nff9FZoJO03QhXLvOORT+lPAkW6gFzaoeMaGb40HakkZn3uvlAEKrKrtR0rZEok+N1hnboaAu8oaKK0rF1W6iNrXcFrO0rcrCsFTVF8qCa/1dFmIXwUd2M6cUzT9W0YkNyb6ZBbwEhjwBL4DNW4JfeF2Dzj0eZYlSuYV7e7e1e+XEO8lwPLAiy4bEFAWCaeuDVIhbIoBaU6xHNVQoyzct98gaOYxE4mVDqAUVmhfAgMBAAE=";
  12. //您在AGC上申请服务时生成了一对密钥。在此使用该私钥。
  13. String jweSignPrivateKey = "Replace with your private key.";
  14. //生成JWE
  15. String jweStrByInstanceIds = JweUtil.generateJwe(sessionKey, jweSignPrivateKey,newInstanceJsonObject.toJSONString(), sessionKeyPublicKey);
  16. //编码
  17. String contentStr = URLEncoder.encode(jweStrByInstanceIds, StandardCharsets.UTF_8.toString())

步骤3:创建CreateWalletPassRequest。

收起
自动换行
深色代码主题
复制
  1. CreateWalletPassRequest request = CreateWalletPassRequest.getBuilder()
  2. .setContent(jwtStr)
  3. .build();

步骤4:创建Client实例。

收起
自动换行
深色代码主题
复制
  1. WalletPassClient walletObjectsClient = Wallet.getWalletPassClient(PassTestActivity.this);

步骤5:创建Task。

收起
自动换行
深色代码主题
复制
  1. Task<AutoResolvableForegroundIntentResult> task = walletObjectsClient.createWalletPass(request);

步骤6:执行Task。

收起
自动换行
深色代码主题
复制
  1. // Save_flag为任务执行标志,用于接收任务执行结果。
  2. ResolveTaskHelper.excuteTask(task, XXXActivity.this, SAVE_FLAG);

步骤7:接收添加会员卡结果。

收起
自动换行
深色代码主题
复制
  1. public void onActivityResult(int requestCode, int resultCode, Intent data) {
  2.    switch (requestCode) {
  3.        //SAVE_FLAG为步骤6设置的常量值
  4.        case SAVE_FLAG:
  5.            switch (resultCode) {
  6.                case Activity.RESULT_OK:
  7.                    Toast.makeText(this, "save success", Toast.LENGTH_LONG).show();
  8.                    break;
  9.                case Activity.RESULT_CANCELED:
  10.                    Toast.makeText(this, "cancel by user", Toast.LENGTH_LONG).show();
  11.                    break;
  12.                default:
  13.                    if (data != null) {
  14.                        int errorCode =
  15.                                data.getIntExtra(
  16.                                        WalletCommonConstants.EXTRA_ERROR_CODE, -1);
  17.                        Toast.makeText(this, "fail, [" + errorCode + "]:" + errorCode, Toast.LENGTH_LONG).show();
  18.                    } else {
  19.                        Toast.makeText(this, "fail:data is null", Toast.LENGTH_LONG).show();
  20.                    }
  21.                    break;
  22.            }
  23.    }
  24. }

----结束。


本页面可能包含由第三方许可的内容,请参考具体描述
在 指南 中进行搜索
请输入您想要搜索的关键词