安卓支付之ping++开发

来源:互联网 发布:知乎广告在哪里看 编辑:程序博客网 时间:2024/04/29 19:46

Ping++是为移动开发者解决支付接入问题的平台,移动开发者只需一次性接入Ping++的SDK,即可快速完成当前主流的支付渠道接入,并定制自己的支付系统。

那么如何在自己的APP中使用ping++呢? 请往下看~

首先 咱们先要现在人家提供的SDK(client-sdk)倒入到咱们的开发环境下,然后关联到咱们的项目中。

下面我们要添加一些 依赖包 这个可以去 官方给的 地址去下载 并导入到咱们的项目里面的libs目录下,如果是AndroidStudio的话,要讲so文件请添加到jniLibs目录中)然后将lib/assets目录下的data.bin添加到项目工程的assets下面。

Ok 添加完了这些呢 咱们要进行下一步的添加就是所谓的权限

<!-- 通用权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 百度支付需要的权限 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_SMS" />       

千万不要少加!

完成这步以后,接下来咱们要注册Activity

<!-- Ping++ sdk -->
<activity
    android:name="com.pingplusplus.android.PaymentActivity"
    android:configChanges="orientation|screenSize"
    android:launchMode="singleTop"
    android:theme="@android:style/Theme.Translucent.NoTitleBar" />
<!-- 微信支付 sdk ,也是 Ping++ sdk 调用入口 -->
<activity-alias
    android:name=".wxapi.WXPayEntryActivity"
    android:exported="true"
    android:targetActivity="com.pingplusplus.android.PaymentActivity" />
<!-- 支付宝 sdk -->
<activity
    android:name="com.alipay.sdk.app.H5PayActivity"
    android:configChanges="orientation|keyboardHidden|navigation"
    android:exported="false"
    android:screenOrientation="behind" >
</activity>
<activity
    android:name="com.alipay.sdk.auth.AuthActivity"
    android:configChanges="orientation|keyboardHidden|navigation"
    android:exported="false"
    android:screenOrientation="behind" >
</activity>


<!-- 银联支付 sdk -->
<activity android:name="com.unionpay.uppay.PayActivity" >
</activity>


<!-- 百付宝 sdk -->
<activity
    android:name="com.baidu.paysdk.login.LoginActivity"
    android:configChanges="keyboardHidden|navigation|orientation|screenSize"
    android:excludeFromRecents="true"
    android:exported="false"
    android:theme="@style/EbpayThemeActivityWelcome"
    android:windowSoftInputMode="stateHidden" />
<activity
    android:name="com.baidu.paysdk.ui.WelcomeActivity"
    android:configChanges="keyboardHidden|navigation|orientation|screenSize"
    android:excludeFromRecents="true"
    android:exported="@bool/bd_wallet_switch_global_debug"
    android:screenOrientation="portrait"
    android:theme="@style/EbpayThemeActivityWelcome"
    android:windowSoftInputMode="stateHidden" />
<activity
    android:name="com.baidu.paysdk.ui.OrderHomeActivity"
    android:configChanges="keyboardHidden|navigation|orientation|screenSize"
    android:excludeFromRecents="true"
    android:exported="@bool/bd_wallet_switch_global_debug"
    android:hardwareAccelerated="false"
    android:screenOrientation="portrait"
    android:theme="@style/EbpayThemeActivit"
    android:windowSoftInputMode="stateHidden" />
<activity
    android:name="com.baidu.paysdk.ui.PayResultActivity"
    android:configChanges="keyboardHidden|navigation|orientation|screenSize"
    android:excludeFromRecents="true"
    android:exported="@bool/bd_wallet_switch_global_debug"
    android:screenOrientation="portrait"
    android:theme="@style/EbpayThemeActivit"
    android:windowSoftInputMode="stateHidden" />
<activity
    android:name="com.baidu.paysdk.ui.PcPwdCheckActivity"
    android:configChanges="keyboardHidden|navigation|orientation|screenSize"
    android:excludeFromRecents="true"
    android:exported="@bool/bd_wallet_switch_global_debug"
    android:screenOrientation="portrait"
    android:theme="@style/EbpayThemeActivit"
    android:windowSoftInputMode="stateVisible" />
<activity
    android:name="com.baidu.paysdk.ui.PwdCheckActivity"
    android:configChanges="keyboardHidden|navigation|orientation|screenSize"
    android:excludeFromRecents="true"
    android:exported="@bool/bd_wallet_switch_global_debug"
    android:screenOrientation="portrait"
    android:theme="@style/EbpayThemeActivit"
    android:windowSoftInputMode="stateVisible" />
<activity
    android:name="com.baidu.paysdk.ui.PwdSetAndConfirmActivity"
    android:configChanges="keyboardHidden|navigation|orientation|screenSize"
    android:excludeFromRecents="true"
    android:exported="@bool/bd_wallet_switch_global_debug"
    android:theme="@style/EbpayThemeActivit"
    android:windowSoftInputMode="stateVisible" />
<activity
    android:name="com.baidu.paysdk.ui.PwdPayActivity"
    android:configChanges="keyboardHidden|navigation|orientation|screenSize"
    android:excludeFromRecents="true"
    android:exported="@bool/bd_wallet_switch_global_debug"
    android:screenOrientation="portrait"
    android:theme="@style/EbpayThemeActivitTranslucent"
    android:windowSoftInputMode="stateVisible|adjustResize" />
<activity
    android:name="com.baidu.paysdk.ui.PwdPaySmsActivity"
    android:configChanges="keyboardHidden|navigation|orientation|screenSize"
    android:excludeFromRecents="true"
    android:exported="@bool/bd_wallet_switch_global_debug"
    android:screenOrientation="portrait"
    android:theme="@style/EbpayThemeActivitTranslucent"
    android:windowSoftInputMode="stateHidden" />
<activity
    android:name="com.baidu.paysdk.ui.WebViewActivity"
    android:configChanges="keyboardHidden|navigation|orientation|screenSize"
    android:excludeFromRecents="true"
    android:exported="@bool/bd_wallet_switch_global_debug"
    android:screenOrientation="portrait"
    android:theme="@style/EbpayThemeActivit"
    android:windowSoftInputMode="stateHidden" />
<activity
    android:name="com.baidu.paysdk.ui.BindCardNoActivity"
    android:configChanges="keyboardHidden|navigation|orientation|screenSize"
    android:excludeFromRecents="true"
    android:exported="@bool/bd_wallet_switch_global_debug"
    android:launchMode="singleTask"
    android:screenOrientation="portrait"
    android:theme="@style/EbpayThemeActivit"
    android:windowSoftInputMode="stateHidden" />
<activity
    android:name="com.baidu.paysdk.ui.BindCardDetailActivity"
    android:configChanges="keyboardHidden|navigation|orientation|screenSize"
    android:excludeFromRecents="true"
    android:exported="@bool/bd_wallet_switch_global_debug"
    android:launchMode="singleTask"
    android:screenOrientation="portrait"
    android:theme="@style/EbpayThemeActivit"
    android:windowSoftInputMode="stateVisible|adjustPan" />
<activity
    android:name="com.baidu.paysdk.ui.BindCardDetailCredit2Activity"
    android:configChanges="keyboardHidden|navigation|orientation|screenSize"
    android:excludeFromRecents="true"
    android:exported="@bool/bd_wallet_switch_global_debug"
    android:launchMode="singleTask"
    android:screenOrientation="portrait"
    android:theme="@style/EbpayThemeActivit"
    android:windowSoftInputMode="stateVisible|adjustPan" />
<activity
    android:name="com.baidu.paysdk.ui.BindCardDetailCreditActivity"
    android:configChanges="keyboardHidden|navigation|orientation|screenSize"
    android:excludeFromRecents="true"
    android:exported="@bool/bd_wallet_switch_global_debug"
    android:launchMode="singleTask"
    android:screenOrientation="portrait"
    android:theme="@style/EbpayThemeActivit"
    android:windowSoftInputMode="stateVisible|adjustPan" />
<activity
    android:name="com.baidu.paysdk.ui.BindSmsActivity"
    android:configChanges="keyboardHidden|navigation|orientation|screenSize"
    android:excludeFromRecents="true"
    android:exported="@bool/bd_wallet_switch_global_debug"
    android:screenOrientation="portrait"
    android:theme="@style/EbpayThemeActivit"
    android:windowSoftInputMode="adjustResize" />
<activity
    android:name="com.baidu.paysdk.ui.SelectBindCardActivity"
    android:configChanges="keyboardHidden|navigation|orientation|screenSize"
    android:excludeFromRecents="true"
    android:exported="@bool/bd_wallet_switch_global_debug"
    android:screenOrientation="portrait"
    android:theme="@style/EbpayThemeActivit"
    android:windowSoftInputMode="stateHidden" />
<activity
    android:name="com.baidu.paysdk.ui.SignChannelListActivity"
    android:configChanges="keyboardHidden|navigation|orientation|screenSize"
    android:excludeFromRecents="true"
    android:exported="@bool/bd_wallet_switch_global_debug"
    android:hardwareAccelerated="false"
    android:theme="@style/EbpayThemeActivit"
    android:windowSoftInputMode="stateHidden" >
</activity>

关键的一步操作来了 就是获取charge

charge 对象是一个包含支付信息的json对象,是 ping++ SDK 发起支付的必须的参数。该参数需要请求用户服务器获得,服务端生成charge的方式参考ping++ 官方文档,地址 https://pingxx.com/guidance/server/import。 sdk 中的 demo 里面提供了如何获取 charge 的实例方法,供用户参考。

这些工作准备好以后那么咱们就可以发起支付了

发起支付
Intent intent = new Intent();
String packageName = getPackageName();
ComponentName componentName = new ComponentName(packageName, packageName + ".wxapi.WXPayEntryActivity");
intent.setComponent(componentName);
intent.putExtra(PaymentActivity.EXTRA_CHARGE, charge);
startActivityForResult(intent, REQUEST_CODE_PAYMENT);

说明: 上述发起方式是 Ping++ client-sdk 唯一公开调用方式, “.wxapi.WXPayEntryActivity“ 是所有渠道支付的入口,并非只是微信支付入口。
五、获取支付状态


从 Activity 的 onActivityResult 方法中获得支付结果。支付成功后,用户服务器也会收到ping++ 服务器发送的异步通知。 最终支付成功请根据服务端异步通知为准。


protected void onActivityResult(int requestCode, int resultCode, Intent data) {
 //支付页面返回处理
    if (requestCode == REQUEST_CODE_PAYMENT) {
        if (resultCode == Activity.RESULT_OK) {
            String result = data.getExtras().getString("pay_result");
            /* 处理返回值
             * "success" - payment succeed
             * "fail"    - payment failed
             * "cancel"  - user canceld
             * "invalid" - payment plugin not installed
             */
            String errorMsg = data.getExtras().getString("error_msg"); // 错误信息
            String extraMsg = data.getExtras().getString("extra_msg"); // 错误信息
            showMsg(result, errorMsg, extraMsg);
        }
    }
}
注意事项

Android 不允许再 UI 线程中进行网络请求,所以请求 charge 对象的时候请使用 thread+handler 或者使用 AsyncTask 。example 里面的示例程序使用的就是 AsyncTask 方式请求 charge 对象。
关于定制

用户可以根据需求自行定制一个或者多个支付渠道。但是定制 sdk 的时候需要注意以下几点
1、libpingpp.jar 、libammsdk.jar 这两个 jar 包是必须的。

其中 libpingpp.jar 是 ping++ SDK 的核心类。libammsdk.jar 是微信支付的核心类。因为微信支付方式要求比较特殊,所以无法从 ping++ SDK 中彻底剔除微信支付所需的 libammsdk.jar 
2、PaymentActivity 和 .wxapi.WXPayEntryActivity 必须在 AndroidManifest.xml 文件里面声明。

<!-- ping++SDK 注册 -->
<activity
    android:name="com.pingplusplus.android.PaymentActivity"
    android:launchMode="singleTop"
    android:theme="@android:style/Theme.Translucent.NoTitleBar" />
<!-- 微信支付注册-->
<activity-alias
    android:name=".wxapi.WXPayEntryActivity"
    android:exported="true"
    android:targetActivity="com.pingplusplus.android.PaymentActivity" />
3、权限

1、微信支付渠道是通过向“微信“客户端发起请求进行支付的,要求手机必须安装微信。如果没有安装微信,ping++ sdk 会在支付结果中给予通知。不需要额外权限。
2、银联支付渠道是通过“银联手机支付服务“进行支付的,要求手机必须安装“银联手机支付服务”。如果没有安装,ping++ sdk 会在支付结果中给予提示。不需求额外权限。
3、支付宝、微信等渠道,需要的权限为
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
4、百度支付渠道,需要额外添加权限
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_SMS" />
4、依赖包

1、微信支付依赖包: libammsdk.jar
2、百度支付依赖包: bdwallet_pay_sdk 工程
3、银联支付依赖包: UPPayAssisEx.jar 、 UPPayPluginExStd.jar、android-support-v4.jar
4、支付宝支付依赖包: alipaySDK-xxxxxxxx.jar
5、注册activity

用户如果选择不适用某种渠道,可以把该渠道的 Activity 从 AndroidManifest.xml 里面删除。
需要注意的是,如果用户不适用微信支付,可以删除。
<activity-alias
    android:name=".wxapi.WXPayEntryActivity"
    android:exported="true"
    android:targetActivity="com.pingplusplus.android.PaymentActivity" />
这时支付的调用接口需要改为:

Intent intent = new Intent(MainActivity.this,PaymentActivity.class);
intent.putExtra(PaymentActivity.EXTRA_CHARGE, data);
startActivityForResult(intent, REQUEST_CODE_PAYMENT);
混淆设置

用户进行 apk 混淆打包的时候,为了不影响 pingpp sdk 以及渠道 sdk 的使用,请在 proguard-rules 中添加一下混淆规则。

-dontwarn com.alipay.**
-keep class com.alipay.** {*;}


-dontwarn  com.ta.utdid2.**
-keep class com.ta.utdid2.** {*;}

-dontwarn  com.ut.device.**
-keep class com.ut.device.** {*;}

-dontwarn  com.tencent.**
-keep class com.tencent.** {*;}

-dontwarn  com.unionpay.**
-keep class com.unionpay.** {*;}

-dontwarn com.pingplusplus.**
-keep class com.pingplusplus.** {*;}

-dontwarn com.baidu.**
-keep class com.baidu.**{*;}

-keepclassmembers class * {
    @android.webkit.JavascriptInterface <methods>;
}

好了 以上就是详细操作了,不足的地方大家多指教,祝大家生活愉快~

0 2
原创粉丝点击