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); + } +}