diff --git a/app/build.gradle b/app/build.gradle
index 4271603..fb6cc88 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -9,7 +9,7 @@ android {
versionCode 1
versionName "1.0.0"
ndk {
- abiFilters 'armeabi-v7a'
+ abiFilters 'armeabi'
}
}
buildTypes {
@@ -35,7 +35,7 @@ android {
}
dependencies {
- implementation fileTree(include: '*.jar', dir: 'libs')
+ implementation fileTree(include: ['*.jar','*.aar'], dir: 'libs')
implementation(name: 'egret', ext: 'aar')
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'com.android.volley:volley:1.1.1'
diff --git a/app/libs/armeabi/libvivo_account_sdk.so b/app/libs/armeabi/libvivo_account_sdk.so
new file mode 100644
index 0000000..35cd0ce
Binary files /dev/null and b/app/libs/armeabi/libvivo_account_sdk.so differ
diff --git a/app/libs/msa_mdid_1.0.13.aar b/app/libs/msa_mdid_1.0.13.aar
new file mode 100644
index 0000000..650e98d
Binary files /dev/null and b/app/libs/msa_mdid_1.0.13.aar differ
diff --git a/app/libs/vivounionsdk_v4.6.0.1.jar b/app/libs/vivounionsdk_v4.6.0.1.jar
new file mode 100644
index 0000000..0cb79db
Binary files /dev/null and b/app/libs/vivounionsdk_v4.6.0.1.jar differ
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index d5882f7..7c12780 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -1,7 +1,16 @@
+
+
+
+
+
+
+
+
@@ -39,19 +48,30 @@
-
-
-
-
-
-
-
-
+
+
+
+
+
-
-
-
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/assets/supplierconfig.json b/app/src/main/assets/supplierconfig.json
new file mode 100644
index 0000000..a6ecba4
--- /dev/null
+++ b/app/src/main/assets/supplierconfig.json
@@ -0,0 +1,17 @@
+{
+ "supplier":{
+ "vivo":{
+ "appid":"104485272"
+ },
+ "xiaomi":{
+
+ },
+ "huawei":{
+
+ },
+ "oppo":{
+
+ }
+ }
+
+}
diff --git a/app/src/main/assets/vivounionsdk/vivounionapk.vua b/app/src/main/assets/vivounionsdk/vivounionapk.vua
new file mode 100644
index 0000000..0110bab
Binary files /dev/null and b/app/src/main/assets/vivounionsdk/vivounionapk.vua differ
diff --git a/app/src/main/assets/vivounionsdk/vivounionchecklist.xml b/app/src/main/assets/vivounionsdk/vivounionchecklist.xml
new file mode 100644
index 0000000..5ad9d3a
--- /dev/null
+++ b/app/src/main/assets/vivounionsdk/vivounionchecklist.xml
@@ -0,0 +1,244 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/hnjc/wjtx/JCApplication.java b/app/src/main/java/com/hnjc/wjtx/JCApplication.java
index e040a76..38c3a89 100644
--- a/app/src/main/java/com/hnjc/wjtx/JCApplication.java
+++ b/app/src/main/java/com/hnjc/wjtx/JCApplication.java
@@ -3,10 +3,100 @@ package com.hnjc.wjtx;
import android.app.Application;
import android.util.Log;
+import com.hnjc.wjtx.vivo.VivoUnionHelper;
+import com.vivo.unionsdk.open.MissOrderEventHandler;
+import com.vivo.unionsdk.open.OrderResultInfo;
+
+import java.util.ArrayList;
+import java.util.List;
+
public class JCApplication extends Application {
+ private final String TAG = "JCApplication";
@Override
public void onCreate() {
super.onCreate();
Log.i("JCApplication", "JCApplication onCreate");
+ VivoUnionHelper.initSdk(this, false);
+
+ /**
+ * 掉单注册接口 需要接入掉单补单处理的一定要加
+ * !!!! 一定要加,否则无法通过上架审核 !!!
+ * 作用:商品补发回调
+ * 场景:支付完成后,游戏未正常发放商品,或发放后未成功通知到vivo侧,在异常订单查询后自动触发
+ */
+ VivoUnionHelper.registerMissOrderEventHandler(this, mMissOrderEventHandler);
+ }
+
+ /**
+ * 用户主动触发或调用queryMissOrderResult查询回调会在此做处理
+ */
+ private MissOrderEventHandler mMissOrderEventHandler = new MissOrderEventHandler() {
+ @Override
+ public void process(List orderResultInfos) {
+ Log.i(TAG, "registerOrderResultEventHandler: orderResultInfos = " + orderResultInfos);
+ /**
+ * 注意这里是查到未核销的订单
+ * 需要调用自己的逻辑完成道具核销后再调用我们的订单完成接口
+ * 切记!!!一定要走自己逻辑发送完道具后再调用完成接口!!!切记!切记!
+ * !!!游戏根据订单号检查、补发商品!!!
+ * 自行完成补发逻辑 一定要完成道具补发后才能调用完成接口 此处一定要注意!!!
+ * 如果不处理直接调用完成则掉单无法解决
+ * 注意!!!注意!!!
+ * 游戏侧用你们自己的订单号cpOrderNumber来校验是否完成发货 发货完成上报我们的订单号transNo
+ */
+ checkOrder(orderResultInfos);
+ }
+ };
+ /**
+ * 校验订单是否已经完成发货(游戏自己逻辑)
+ * 未完成的执行发货操作
+ * @param list
+ */
+ public void checkOrder(final List list) {
+ if (list == null || list.isEmpty()) {
+ return;
+ }
+ List orderList = new ArrayList<>();
+ for (int i = 0; i < list.size(); i++) {
+ /**
+ * 校验是否已经完成发货 如果已经完成发货则加入完成列表
+ * 未完成则调用发货流程
+ * 这里修改成自己的校验流程 调用游戏自己的服务器 注意!!!注意!!!
+ */
+ boolean isSucc = true;
+ if (isSucc) {
+ /**
+ * 校验已发货成功的 加入已完成列表 这里传的是transNo
+ */
+ orderList.add(list.get(i).getTransNo());
+ } else {
+ /**
+ * 未完成发货的执行发货流程
+ */
+ sendProp(list.get(i));
+ }
+ }
+
+ /**
+ * !!!批量订单补发完成后调用完成接口 !!!
+ */
+ VivoUnionHelper.reportOrderComplete(orderList);
+ }
+
+ /**
+ * 调用发货逻辑(游戏自己实现)
+ * @param orderResultInfo
+ */
+ private void sendProp(final OrderResultInfo orderResultInfo) {
+ /**
+ * 执行发货逻辑 发货成功单独通知
+ */
+ boolean isSucc = true;
+ if (isSucc) {
+ /**
+ * !!!单个订单补发完成后调用完成接口 !!!
+ */
+ VivoUnionHelper.reportOrderComplete(orderResultInfo.getTransNo(), true);
+ }
}
}
diff --git a/app/src/main/java/com/hnjc/wjtx/MainActivity.java b/app/src/main/java/com/hnjc/wjtx/MainActivity.java
index 5f10815..3223adf 100755
--- a/app/src/main/java/com/hnjc/wjtx/MainActivity.java
+++ b/app/src/main/java/com/hnjc/wjtx/MainActivity.java
@@ -1,14 +1,17 @@
package com.hnjc.wjtx;
+import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
+import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
import android.os.VibrationEffect;
import android.os.Vibrator;
+import android.text.TextUtils;
import android.util.Log;
import android.view.KeyEvent;
import android.widget.FrameLayout;
@@ -18,20 +21,82 @@ import android.widget.Toast;
import com.hnjc.wjtx.util.AssetsUtil;
import com.hnjc.wjtx.util.StorageUtil;
import com.hnjc.wjtx.util.StringUtil;
+import com.hnjc.wjtx.vivo.VivoUnionHelper;
+import com.vivo.unionsdk.open.OrderResultInfo;
+import com.vivo.unionsdk.open.VivoAccountCallback;
+import com.vivo.unionsdk.open.VivoConstants;
+import com.vivo.unionsdk.open.VivoPayCallback;
+import com.vivo.unionsdk.open.VivoRoleInfo;
+import com.vivo.unionsdk.open.VivoUnionSDK;
import org.egret.egretnativeandroid.EgretNativeAndroid;
import org.json.JSONException;
import org.json.JSONObject;
-//Android项目发布设置详见doc目录下的README_ANDROID.md
-
public class MainActivity extends Activity {
private final String TAG = "MainActivity";
private EgretNativeAndroid nativeAndroid;
private ImageView launchScreenImageView = null;
private FrameLayout rootLayout = null;
private Vibrator vibrator;
+ //用户uid
+ private String mUid = "";
+ //游戏订单号
+ private String cpPayOrderNumber;
+ //订单金额
+ private String cpOrderAmount;
+ private VivoAccountCallback mAcccountCallback = new VivoAccountCallback() {
+ @Override
+ public void onVivoAccountLogin(String userName, String uid, String authToken) {
+ // 1. 收到登录成功回调后,调用服务端接口校验登录有效性。arg2返回值为authtoken。服务端接口详见文档。校验登录代码略。
+ mUid = uid;
+ // 2. 登录成功后上报角色信息
+ VivoUnionHelper.reportRoleInfo(new VivoRoleInfo("角色ID", "角色等级", "角色名称", "区服ID", "区服名称"));
+ // 3. 处理自己的登录成功逻辑
+ Toast.makeText(MainActivity.this, "登录成功", Toast.LENGTH_SHORT).show();
+
+ //登录成功
+ VivoUnionHelper.queryMissOrderResult(uid);
+ }
+
+ @Override
+ public void onVivoAccountLogout(int i) {
+
+ }
+
+ @Override
+ public void onVivoAccountLoginCancel() {
+
+ }
+ };
+
+ private VivoPayCallback mVivoPayCallback = new VivoPayCallback() {
+ // 客户端返回的支付结果不可靠,请再查询服务器,以服务器端最终的支付结果为准;
+ @Override
+ public void onVivoPayResult(int i, OrderResultInfo orderResultInfo) {
+ Log.i(TAG, "onVivoPayResult: " + orderResultInfo.getTransNo());
+ Log.i(TAG, "CpOrderNumber: " + cpPayOrderNumber + " i = " + i);
+
+ if (i == VivoConstants.PAYMENT_RESULT_CODE_SUCCESS) {
+ Toast.makeText(MainActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
+ /**
+ * !!!! 一定要加,否则无法通过上架审核 !!!
+ * !!! 商品发放成功以后,通知vivo侧 !!!!
+ * 这里取transNo不要取错了 注意!!!
+ */
+ VivoUnionHelper.reportOrderComplete(orderResultInfo.getTransNo());
+ Log.i(TAG, "sendCompleteOrderNotification: " + orderResultInfo.getTransNo());
+ } else if (i == VivoConstants.PAYMENT_RESULT_CODE_CANCEL) {
+ Toast.makeText(MainActivity.this, "取消支付", Toast.LENGTH_SHORT).show();
+ } else if (i == VivoConstants.PAYMENT_RESULT_CODE_UNKNOWN) {
+ Toast.makeText(MainActivity.this, "未知状态,请查询订单", Toast.LENGTH_SHORT).show();
+ } else {
+ Toast.makeText(MainActivity.this, "支付失败", Toast.LENGTH_SHORT).show();
+ }
+ }
+
+ };
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -67,6 +132,33 @@ public class MainActivity extends Activity {
rootLayout = nativeAndroid.getRootFrameLayout();
showLoadingView();
vibrator = (Vibrator) this.getSystemService(Context.VIBRATOR_SERVICE);
+
+ //注册登录回调
+ VivoUnionSDK.registerAccountCallback(this, mAcccountCallback);
+
+ /**
+ * 动态获取访问手机标识符权限
+ * 这个在游戏中移动要加,不然获取不到imei
+ */
+ if(Build.VERSION.SDK_INT >= 23){
+ int hasPermission = checkSelfPermission(Manifest.permission.READ_PHONE_STATE);
+ if (hasPermission != PackageManager.PERMISSION_GRANTED) {
+ //没有权限,向用户请求权限
+ requestPermissions( new String[]{Manifest.permission.READ_PHONE_STATE}, 0);
+ }
+ }
+ }
+
+ @Override
+ public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
+ if (requestCode == 0){
+ if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
+ //用户同意,执行操作
+
+ }else{
+ finish();
+ }
+ }
}
@Override
@@ -212,4 +304,64 @@ public class MainActivity extends Activity {
launchScreenImageView = null;
}
+ /**
+ * 登录vivo帐号
+ */
+ public void loginVivoAccount() {
+ if (!TextUtils.isEmpty(mUid)) {
+ Toast.makeText(this, "已登录成功,禁止重复登录", Toast.LENGTH_SHORT).show();
+ return;
+ }
+
+ /**
+ * 接入掉单补单接口一定要掉单注册成功后再调用登录接口
+ */
+ VivoUnionHelper.login(this);
+
+ }
+
+ /**
+ * 登录成功后,进行支付
+ */
+ public void payAfterLogin() {
+ if (TextUtils.isEmpty(mUid)) {
+ Toast.makeText(this, "支付失败,请先登录", Toast.LENGTH_SHORT).show();
+ return;
+ }
+// VivoPayInfo vivoPayInfo = VivoSign.createPayInfo(mUid, getOrderBean());
+// VivoUnionHelper.payV2(this, vivoPayInfo, mVivoPayCallback);
+ }
+
+ /**
+ * //直接调起微信或支付宝支付
+ *
+ * @param code 1表示微信,2表示支付宝
+ */
+ public void payAfterLogin(int code) {
+ if (TextUtils.isEmpty(mUid)) {
+ Toast.makeText(this, "支付失败,请先登录", Toast.LENGTH_SHORT).show();
+ return;
+ }
+// VivoPayInfo vivoPayInfo = VivoSign.createPayInfo(mUid, getOrderBean());
+// VivoUnionHelper.payNowV2(this, vivoPayInfo, mVivoPayCallback, code);
+ }
+
+ /**
+ * 未登录时,进行支付
+ */
+ public void payWithoutLogin() {
+// VivoPayInfo vivoPayInfo = VivoSign.createPayInfo(mUid, getOrderBean());
+// VivoUnionHelper.payV2(this, vivoPayInfo, mVivoPayCallback);
+ }
+
+ /**
+ * 未登录时,进行支付,直接调起微信或支付宝支付
+ *
+ * @param code 1表示微信,2表示支付宝
+ */
+ public void payWithoutLogin(int code) {
+// VivoPayInfo vivoPayInfo = VivoSign.createPayInfo(mUid, getOrderBean());
+// VivoUnionHelper.payNowV2(this, vivoPayInfo, mVivoPayCallback, code);
+ }
+
}
diff --git a/app/src/main/java/com/hnjc/wjtx/vivo/VivoUnionHelper.java b/app/src/main/java/com/hnjc/wjtx/vivo/VivoUnionHelper.java
new file mode 100644
index 0000000..e281937
--- /dev/null
+++ b/app/src/main/java/com/hnjc/wjtx/vivo/VivoUnionHelper.java
@@ -0,0 +1,117 @@
+package com.hnjc.wjtx.vivo;
+
+import android.app.Activity;
+import android.content.Context;
+import android.text.TextUtils;
+
+import com.vivo.unionsdk.open.MissOrderEventHandler;
+import com.vivo.unionsdk.open.VivoPayCallback;
+import com.vivo.unionsdk.open.VivoPayInfo;
+import com.vivo.unionsdk.open.VivoRoleInfo;
+import com.vivo.unionsdk.open.VivoUnionSDK;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class VivoUnionHelper {
+ private static final String TAG = "VivoUnionHelper";
+
+ /**
+ * 初始化sdk
+ *
+ * @param context
+ * @param debug
+ */
+ public static void initSdk(Context context, boolean debug) {
+ VivoUnionSDK.initSdk(context, "104485272", debug);
+ }
+
+ /**
+ * 查询订单状态
+ *
+ * @param openid 帐号唯一标识,登录后获取
+ */
+ public static void queryMissOrderResult(String openid) {
+ VivoUnionSDK.queryMissOrderResult(openid);
+ }
+
+ /**
+ * 登录成功后上报角色信息
+ *
+ * @param vivoRoleInfo 角色信息
+ */
+ public static void reportRoleInfo(VivoRoleInfo vivoRoleInfo) {
+ VivoUnionSDK.reportRoleInfo(vivoRoleInfo);
+ }
+
+ /**
+ * 查询是否有调单
+ *
+ * @param missOrderEventHandler
+ */
+ public static void registerMissOrderEventHandler(final Context context, MissOrderEventHandler missOrderEventHandler) {
+ VivoUnionSDK.registerMissOrderEventHandler(context, missOrderEventHandler);
+ }
+
+
+ /**
+ * 直接吊起微信与支付宝
+ *
+ * @param activity
+ * @param mVivoPayCallback 支付结果回调
+ * @param code 1表示微信,2表示支付宝
+ */
+ public static void payNowV2(Activity activity, VivoPayInfo vivoPayInfo, VivoPayCallback mVivoPayCallback, int code) {
+ VivoUnionSDK.payNowV2(activity, vivoPayInfo, mVivoPayCallback, code);
+ }
+
+ /**
+ * 吊起支付面板
+ *
+ * @param activity
+ * @param mVivoPayCallback 支付结果回调
+ */
+ public static void payV2(Activity activity, VivoPayInfo vivoPayInfo, VivoPayCallback mVivoPayCallback) {
+ VivoUnionSDK.payV2(activity, vivoPayInfo, mVivoPayCallback);
+ }
+
+
+ /**
+ * 登录
+ *
+ * @param activity
+ */
+ public static void login(Activity activity) {
+ VivoUnionSDK.login(activity);
+ }
+
+ /**
+ * 游戏方发放商品成功主动通知联运
+ *
+ * @param list vivo订单号列表
+ */
+ public static void reportOrderComplete(List list) {
+ if (list == null || list.isEmpty()) {
+ return;
+ }
+ VivoUnionSDK.reportOrderComplete(list, true);
+ }
+
+ public static void reportOrderComplete(String transNo) {
+ if (TextUtils.isEmpty(transNo)) {
+ return;
+ }
+ List list = new ArrayList<>();
+ list.add(transNo);
+ VivoUnionSDK.reportOrderComplete(list, false);
+ }
+
+ public static void reportOrderComplete(String transNo, boolean b) {
+ if (TextUtils.isEmpty(transNo)) {
+ return;
+ }
+ List list = new ArrayList<>();
+ list.add(transNo);
+ VivoUnionSDK.reportOrderComplete(list, b);
+ }
+}