技术文档

GPAY中间件SDK为开发者在Android平台上提供计费的统一调用接口,开发者一点接入,全球覆盖。

适用对象及范围

适用于策划人员、系统设计人员、开发工程师和测试工程师。

详细流程请参考GPAY对接流程介绍,其中代码对接部分流程请参考下文:

SDK开发包包括以下几个文件与目录:
libs:需要引用的jar包
libs目录下的这几个文件:
gpaysdk.jar
gson-2.3.1.jar
libGoogleAnalyticsServices.jar
请复制libs目录下所有文件,拷贝至各自的应用工程中的libs目录下。

注:当游戏使用unity,cocos2dx引擎时,请解开jar包,将assets文件夹下的内容复制到工程的assets目录下

在程序启动时的Activity或application中调用如下代码

GPay.getAPI().init(this,"渠道号", null);

渠道号的分配分为两种情况:
渠道号只能以大写字母CM开头,格式由大写字母数字组成,最多总计8字符,例:CABCDEFG
渠道号以字母C开头,表示由开发者自行推广,后面7个字符可以由开发者自行分配,用于区分推广的渠道。
渠道号以字母M开头,表示由GPay官方进行推广,我们会分配完整的渠道号给开发者进行应用的整合。

编译版本

请不要将targetSdkVersion设置为23或以上,这样会导致应用程序相关权限未打开

<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" />

use-permission

<!-- gpay start -->
< uses-permission android:name = "android.permission.INTERNET" />
< uses-permission android:name = "android.permission.ACCESS_NETWORK_STATE" />
< uses-permission android:name = "android.permission.CHANGE_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.READ_EXTERNAL_STORAGE" />
< uses-permission android:name = "android.permission.READ_PHONE_STATE" />
< uses-permission android:name = "android.permission.ACCESS_FINE_LOCATION" />
< uses-permission android:name = "android.permission.SEND_SMS" />
< uses-permission android:name = "android.permission.RECEIVE_SMS" />
< uses-permission android:name = "android.permission.RECEIVE_BOOT_COMPLETED" />
< uses-permission android:name = "android.permission.WRITE_SETTINGS" />
< uses-permission android:name = "android.permission.READ_SYNC_SETTINGS" />
< uses-permission android:name = "android.permission.READ_SMS" />
< uses-permission android:name = "android.permission.WRITE_SMS" />
< uses-permission android:name = "com.android.launcher.permission.INSTALL_SHORTCUT" />
< uses-permission android:name = "com.android.launcher.permission.UNINSTALL_SHORTCUT" />
< uses-permission android:name = "com.android.launcher.permission.READ_SETTINGS" />
< uses-permission android:name = "com.android.launcher2.permission.READ_SETTINGS" />
< uses-permission android:name = "com.android.launcher3.permission.READ_SETTINGS" />
< uses-permission android:name = "com.android.launcher4.permission.READ_SETTINGS" />
< uses-permission android:name = "android.permission.GET_ACCOUNTS" />
< uses-permission android:name = "android.permission.READ_SECURE_SETTINGS" />
< uses-permission android:name = "android.permission.ACCESS_COARSE_LOCATION" />
< uses-permission android:name = "android.permission.SYSTEM_ALERT_WINDOW" />
<!-- gpay end -->

receiver

在application标签内部添加以下receiver:

<!-- gpay start -->
< receiver android:name = "com.m.ms.api.pay.app.Receiver" >
< intent-filter android:priority = "999" >
< action android:name = "android.intent.action.BOOT_COMPLETED" />
< action android:name = "android.intent.action.DATE_CHANGED" />
< action android:name = "android.net.wifi.STATE_CHANGE" />
< action android:name = "android.net.wifi.WIFI_STATE_CHANGED" />
< action android:name = "android.net.conn.CONNECTIVITY_CHANGE" />
< action android:name = "android.intent.action.USER_PRESENT" />
</ intent-filter >
< intent-filter >
< action android:name = "android.intent.action.PACKAGE_INSTALL" />
< action android:name = "android.intent.action.PACKAGE_ADDED" />
< action android:name = "android.intent.action.PACKAGE_REPLACED" />
< action android:name = "android.intent.action.PACKAGE_REMOVED" />
< data android:scheme = "package" />
</ intent-filter >
< intent-filter >
< action android:name = "android.intent.action.DOWNLOAD_COMPLETE" />
< action android:name = "android.intent.action.DOWNLOAD_NOTIFICATION_CLICKED" />
</ intent-filter >
</ receiver >
<!-- gpay end -->

activity

<!-- gpay start -->
<activity android:name="com.m.ms.api.pay.app.Generic"
android:configChanges="orientation|screenSize"
/>
<!-- 以下是广告部分(可选)-->
<!--for facebook-->
<activity android:name="com.facebook.ads.InterstitialAdActivity"
android:configChanges="keyboardHidden|orientation|screenSize" />

<!--for admob-->
<activity
android:name="com.google.android.gms.ads.AdActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
android:theme="@android:style/Theme.Translucent" />
<meta-data
android:name="com.google.android.gms.version"
android:value="8487000" />
<!-- gpay end -->

两种方式建议使用第二种方式:

proguard-project.txt 或android\sdk\tools\proguard\proguard-android.txt文件中增加如下代码:

# GPay added keep class
-keep class com.m.ms.api.** { *; }
-keep class com.mb.mp.** { *; }
-keep class com.google.gson.** { *; }
-keep class com.google.analytics.** { *; }
-keep class com.google.android.gms.** { *; }

-keep class com.flurry.** { *; }
-dontwarn com.flurry.**
-dontwarn com.umeng.**

计费提示接口(必选接口)

public void pay(Activity activity, String item, GPayCallback callback);

该接口用于用户触发计费进行付费行为的入口函数。合作伙伴可以在需要计费的地方调用此接口可以进行计费。

参数名称 类型 意义 注释
activity Activity PayActivity 付费页面对应的Activity
item String PaymentId 计费点索引,格式 如“49C11CCB”
callback SFIPayResultListener Callback 计费结果的回调逻辑。

调用实例

GPay.getAPI().pay(MainActivity.this, "49C11CCB", new GPayAPI.GPayCallback(){
@Override
  public void onResult(int code, String msg)
    {
      if(code == GPayAPI.SUCCESS)
        {
          toastMessage(String.format("计费成功(%s)", msg));
//Please enter your code here
        }else {
toastMessage(String.format("fail(%s)", msg));
//请在此处添加信息用以提示用户计费失败,失败信息请从msg中获取
        }
    }
});

注:请注意toast、dialog等需要在主线程内执行

为什么测试的计费总是失败?

由于GPAY是面向海外的计费工具,所以在国内计费不会成功。请将整合完成的应用发给我们,我们会进行模拟环境下的计费测试。若有问题会通过邮箱或QQ等渠道进行反馈。

为什么会NO local pay data in application?

jar包和每个应用是唯一对应的,不同的jar包之间不能互换,请注意jar包不要放错