Developer技术博客 DevEngineer:林建有

Android-微信支付-支付宝SDK集成指南


项目文件结构

VRecorder
		|--cnpay //支付模块
		|	|--src
		|	|--libs
		|
		|--staticanalysislib//数据打点探针模块
        |	|--src
        |	|--libs
        |
        |---themelibrary//主题配色、字符串资源模块
        |	|-src
        |	|-libs
        |
        |--App//主项目模块
        	|-src
        	|-libs

微信

支付流程

请求服务器接口下订单—>调用本地SDK支付—>SDK返回支付结果—>服务器验证查询订单支付结果

微信支付服务器接口文档

支付宝

支付流程

请求服务器接口下订单—>调用本地SDK支付—>SDK返回支付结果—>服务器验证查询订单支付结果

支付宝服务器接口文档

恢复购买

  • 支付宝恢复购买流程:

请求服务器接口获得授权信息—>调用支付宝SDK对授权信息进行授权—>获得openID再请求服务器接口获取所有订单购买情况

  • 微信恢复购买流程:

微信SDK发起授权获取code—>通过请求微信官网的链接接口进行验证授权返回openID—>请求服务接口获取所有订单购买情况

注意事项

微信支付注意事项

对SDK回调响应的类名和包名是有要求的,必须是注册的{包名.wxapi}.WXEntryActivity.java

对于支付回调的类名和包名是{包名.wxapi}.WXPayEntryActivity.java

在类里面实现IWXAPIEventHandler接口,SDK会调用onReq(BaseReq baseReq)onResp(BaseResp baseResp)方法

如果类名和包名不一致会导致无法回调SDK接口。

恢复购买注意事项

每次APP启动都会访问网络查询VIP信息接口,获取当前APP是否已购买状态,同恢复购买接口一样只查询最后购买的支付方式的openID去查询VIP信息接口。两种支付方式的购买单项特权不叠加,即支付宝购买的特权在微信支付方式下未购买的情况下,用微信支付方式恢复购买则不会恢复支付宝已购买的特权。

接入指南

支付模块引用接入

现已经将支付功能模块化成类库了,模块名称为cnpay。在需要用到支付功能的工程项目里在setting.gradle引用模块:

include ':cnpay'

build.gradle里添加依赖支付类库:

dependencies {
    ...
    implementation project(':cnpay')
}

主要入口

跳转到VIP界面

VIP购买页:VipPayActivity.java

VIP购买结果页:BuyVipResultActivity.java

VIP状态页:VipStatusActivity.java

/**
 * 跳转到vip订阅界面
 */
public class LaunchVipBuyActivity {

    public static void toVipBuyActivity(Context context, String type) {
        toVipBuyActivity(context, type, false);
    }
 	/**
     * @param context context
     * @param type            see {@link VipConstant}购买的项目
     * @param isRestoreAction 是否为恢复购买操作
     */
    public static void toVipBuyActivity(Context context, String type, boolean isRestoreAction) {
        if (!VipConstant.HOME.equals(type) && VipSharePreference.isVip(context)) {
            return;
        }
    
        Intent intent = new Intent(context, VipPayActivity.class);
        intent.putExtra(VipConstant.TYPE_KEY, type);
        intent.putExtra(VipConstant.KEY_IS_RESTORE_ACTION, isRestoreAction);
        intent.putExtra(VipConstant.KEY_UUID, Installation.getUUID(context));
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);
        }
    }

VIP 购买状态

购买情况本地存储的类VipSharePreference.java

VIP入口类型:

购买项目跳转VIP入口类型常量VipConstant.java

订单ID

订单ID常量ProductIdConstant.java

更新UI状态方式

当购买成功够更新VIP UI状态的接收方法是通过EventBus收发的:

@Subscribe(threadMode = ThreadMode.MAIN)
public void onEvent(UpdateVipBuyEvent event) {
    // update UI 
}

代码混淆

对gson的entity类做keep

#gson-keep proguard-rules.pro
-keep class com.enjoyglobal.cnpay.network.entity.**{*;}

支付模块框架介绍

  • 网络架构:OKHttp3+Retrofit2+RxJava2

    dependencies {
        implementation 'com.squareup.okhttp3:okhttp:4.0.0'
        implementation 'com.squareup.retrofit2:retrofit:2.6.0'
        implementation 'com.squareup.retrofit2:adapter-rxjava2:2.6.0'
        //主项目有用到该依赖,所有是api传递依赖
        api 'com.squareup.retrofit2:converter-gson:2.6.0'
    }
    
  • 设计模式:MVP模式

    dependencies {
    	api 'com.github.linjonh:mvp-arch-android:1.0.2'
    }
    
  • 引用模块:

    dependencies {
        implementation project(':themelibrary')//主题模块
        implementation project(':statisticanalysislib')//数据打点探针上报模块
    }
    
  • CN VRecorder代码地址:http://192.168.0.233/svn/EnergyAVEditor/Branch/VRecorder/CN_VRecorder/CN_VRecorder_v3.2.1_re(100)


Similar Posts

Comments