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

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