AndroidPay
1.微信SDK更新到6.8.0,支持Android 11吊起微信。
2.调整微信配置说明
3.调整gradle为7.0.2
4.调整JSON解析
5.handleIntent新增异常捕捉
功能介绍
1.微信支付、登录、分享功能
2.支付宝支付、授权登录(极简版+完整版本)功能
3.银联支付功能
软件架构
Builder模式
资源
使用说明
Dependencies
./build.gradle | settings.gradle配置如下
repositories {...maven { url 'https://jitpack.io' }}
./app/build.gradle配置如下
dependencies {implementation 'com.github.RelinRan:AndroidPay:.3.13.1'}
ARR
下载之后放入libs文件夹里面,然后./app/build.gradle配置如下
android {....repositories {flatDir {dirs 'libs'}}}dependencies {implementation(name: 'android_pay_.3.13.1', ext: 'aar')}
微信支付
项目包名下新建wxapi文件夹,然后新建WXPayEntryActivity.java文件,继承WeChatPayActivity
public class WXPayEntryActivity extends WeChatPayActivity {}
AndroidManifest.xml配置
<activityandroid:name=".wxapi.WXPayEntryActivity"android:exported="true"android:launchMode="singleTop"android:screenOrientation="portrait"android:theme="@style/Android.Theme.Light.NoActionBar" />
manifest标签内(与权限同级)下配置
<queries><package android:name="com.tencent.mm" /></queries>
支付调用
WeChatPay.Builder builder = new WeChatPay.Builder(this);builder.appId("xxxx");builder.partnerId("xxx");builder.prepayId("xxx");builder.nonceStr("xxxx");builder.timeStamp("xxxx");builder.packageValue("Sign=WXPay");builder.sign("xxxx");builder.listener(new OnWeChatPayListener() {@Overridepublic void onWeChatPay(int code,String msg) {if(code==WeChatConstants.SUCCEED){//支付成功}if(code==WeChatConstants.CANCEL){//用户取消}if(code==WeChatConstants.FAILED){//支付失败}}});builder.extData(xxxxx);//支付提示文字builder.build();
支付宝支付
AndroidManifest.xml配置,非必要配置(项目本身或者其他arr没有配置org.apache.http.legacy的情况之下需要)
<uses-libraryandroid:name="org.apache.http.legacy"android:required="false" />
支付调用
AliPay.Builder builder = new AliPay.Builder(this);builder.orderInfo("xxxx");builder.listener(new OnAliPayListener() {/*** 参数解释** @param status 是结果码(类型为字符串)。* 9000订单支付成功* 8000正在处理中,支付结果未知(有可能已经支付成功),请查询商户订单列表中订单的支付状态* 4000订单支付失败* 5000重复请求* 6001用户中途取消* 6002网络连接出错* 6004支付结果未知(有可能已经支付成功),请查询商户订单列表中订单的支付状态* 其它其它支付错误* @param json 是处理结果(类型为json结构字符串)* out_trade_noString是64商户网站唯一订单号70501111111S001111119* trade_noString是64该交易在支付宝系统中的交易流水号。最长64位。112400001000340011111118* app_idString是32支付宝分配给开发者的应用Id。072300007148* total_amountPrice是9该笔订单的资金总额,单位为RMB-Yuan。取值范围为[0.01,100000000.00],精确到小数点后两位。9.00* seller_idString是16收款支付宝账号对应的支付宝唯一用户号。以2088开头的纯16位数字2088111111116894* msgString是16处理结果的描述,信息来自于code返回结果的描述success* charsetString是16编码格式utf-8* timestampString是32时间-10-11 17:43:36* codeString是16结果码具体见* @param description description是描述信息(类型为字符串)*/@Overridepublic void onAliPay(String status, String json, String description) {if(status.equals("9000")){//成功}else if(status.equals("6001")){//用户取消}else{//支付失败}}});builder.loading(true);builder.build();
银联支付
UUPay uuPay = new UUPay(this);uuPay.pay(tn,UUPay.PayMode.FORM);
微信登录
项目包名下新建wxapi文件夹,然后新建WXEntryActivity.java文件,继承WeChatAuthActivity
public class WXEntryActivity extends WeChatAuthActivity {}
AndroidManifest.xml配置
<activityandroid:name=".wxapi.WXEntryActivity"android:configChanges="keyboardHidden|orientation|screenSize"android:exported="true"android:taskAffinity="填写你的包名"android:launchMode="singleTask"android:theme="@android:style/Theme.Translucent.NoTitleBar"></activity>
manifest标签内(与权限同级)下配置
<queries><package android:name="com.tencent.mm" /></queries>
微信登录
WeChatLogin.Builder builder = new WeChatLogin.Builder(context);builder.appId("xxx");builder.appSecret("xxx");builder.listener(new OnWXLoginListener() {@Overridepublic void onWeChatLogin(int code, String msg, WeChatUser user) {if (code==WeChatConstants.LOADING){//登录中}if (code==WeChatConstants.SUCCEED){//登录成功}if (code==WeChatConstants.CANCEL){//用户取消登录}if (code==WeChatConstants.AUTH_DENIED){//授权取消}}});builder.build();
支付宝登录(官方文档)
授权登录回调onAliLogin(int code, String memo, AliUser aliUser)回调返回code值如下:
AliLogin.OK = 9000 (调用成功)
AliLogin.Duplex = 5000 (3s内快速发起了多次支付 / 授权调用。稍后重试即可。)
AliLogin.NOT_INSTALLED = 4001(用户未安装支付宝 App。)
AliLogin.SYS_ERR = 4000(其它错误,如参数传递错误。)
AliLogin.CANCEL = 6001(用户取消)
_ERROR = 6002(网络连接出错)
极简版授权(官方文档)
在项目AndroidManifest.xml配置如下(注意:android:scheme="xxxxxxxxxx"这个需要自己配置,最好是自己应用包名)
<activity android:name="com.alipay.sdk.app.AlipayResultActivity" tools:node="merge"><intent-filter tools:node="replace"><action android:name="android.intent.action.VIEW"/><category android:name="android.intent.category.DEFAULT"/><category android:name="android.intent.category.BROWSABLE"/><data android:scheme="xxxxxxxxxx"/></intent-filter></activity>
支付宝登录代码
AliLogin.Builder builder = new AliLogin.Builder(this);builder.appId("xxxxx");builder.scheme("xxxxxx");//必须跟AndroidManifest.xml配置一致builder.listener(new OnAliLoginListener() {@Overridepublic void onAliLogin(int code, String memo, AliUser aliUser) {if (code == AliLogin.OK) {//处理你的逻辑,极简版本只有aliUser.getAuthCode()}}});builder.build();
完整版授权(官方文档)
注意:authInfo需要后端提供,为了安全性。如果后端不提供就是调用OrderInfoUtil工具类如下方法获取
/*** 构建授权信息** @param privateKey 私钥(https://doc./docs/doc.htm?treeId=291&articleId=106097&docType=1)* @param pid 签约的支付宝账号对应的支付宝唯一用户号,以2088开头的16位纯数字组成* @param app_id支付宝分配给开发者的应用ID* @param target_id 商户标识该次用户授权请求的ID,该值在商户端应保持唯一* @param rsa2 签名类型是否是RSA2,否:RSA* @return*/public static String buildAuthInfo(String privateKey, String pid, String app_id, String target_id, boolean rsa2)
授权AndroidManifest.xml配置
<activityandroid:name="com.alipay.sdk.app.H5AuthActivity"android:configChanges="orientation|keyboardHidden|navigation|screenSize"android:exported="false" ></activity><activityandroid:name="com.alipay.sdk.app.H5OpenAuthActivity"android:configChanges="orientation|keyboardHidden|navigation|screenSize"android:exported="false"android:screenOrientation="behind"android:windowSoftInputMode="adjustResize|stateHidden" ></activity>
授权调用代码
AliLogin.Builder builder = new AliLogin.Builder(this);builder.authInfo("xxxxx");builder.listener(new OnAliLoginListener() {@Overridepublic void onAliLogin(int code, String memo, AliUser aliUser) {if (code == AliLogin.OK) {//处理你的逻辑,完整版本有aliUser.getUserId()和aliUser.getAliPayOpenId()}}});builder.build();
微信分享
项目包名下新建wxapi文件夹,然后新建WXEntryActivity.java文件,继承WeChatAuthActivity
public class WXEntryActivity extends WeChatAuthActivity {}
因为根据官方文档集成,其中参数名字也跟官方文档一致,目前只是加了一个thumUrl和imageUrl不跟官方文档一致,为了方便缩略图和图片分享使用网络图片; 其他的参数参考官方文档
图片分享代码
WeChatShare.Builder builder = new WeChatShare.Builder(getContext());builder.type(WeChatShare.TYPE_IMAGE);builder.appId(Constants.WE_CHAT_APP_ID);builder.scene(WeChatShare.SCENE_SESSION);builder.imagePath("本地图片地址");//或者builder.imageUrl("http://xxxxxx");builder.listener(new OnWeChatShareListener() {@Overridepublic void onWeChatShare(int code, String msg) {//分享回调,官方目前取消了回调,不管是否正确分享都会进入。}});builder.build();
视频分享代码
WeChatShare.Builder builder = new WeChatShare.Builder(getContext());builder.type(WeChatShare.TYPE_VIDEO);builder.appId(Constants.WE_CHAT_APP_ID);builder.scene(WeChatShare.SCENE_SESSION);builder.title("标题");builder.description("描述信息");builder.thumbImage(bitmap);//或 builder.thumbUrl("http://xxxxxx"); 或builder.thumbData(byte[]);builder.videoUrl("视频网络地址");builder.listener(new OnWeChatShareListener() {@Overridepublic void onWeChatShare(int code, String msg) {//分享回调,官方目前取消了回调,不管是否正确分享都会进入。if (code==WeChatConstants.SUCCEED){//成功}if (code==WeChatConstants.CANCEL){//取消}}});builder.build();
网页分享代码
WeChatShare.Builder builder = new WeChatShare.Builder(getContext());builder.type(WeChatShare.TYPE_WEB);builder.appId(Constants.WE_CHAT_APP_ID);builder.scene(WeChatShare.SCENE_SESSION);builder.title("标题");builder.description("描述信息");//缩略图设置builder.thumbImage(bitmap);//或 builder.thumbUrl("http://xxxxxx"); 或builder.thumbData(byte[]);builder.webpageUrl("网络地址");builder.listener(new OnWeChatShareListener() {@Overridepublic void onWeChatShare(int code, String msg) {//分享回调,官方目前取消了回调,不管是否正确分享都会进入。if (code==WeChatConstants.SUCCEED){//成功}if (code==WeChatConstants.CANCEL){//取消}}});builder.build();
音乐分享代码
WeChatShare.Builder builder = new WeChatShare.Builder(getContext());builder.type(WeChatShare.TYPE_MUSIC);builder.appId(Constants.WE_CHAT_APP_ID);builder.scene(WeChatShare.SCENE_SESSION);builder.title("标题");builder.description("描述信息");//缩略图设置builder.thumbImage(bitmap);//或 builder.thumbUrl("http://xxxxxx"); 或builder.thumbData(byte[]);builder.musicUrl("网络地址");builder.listener(new OnWeChatShareListener() {@Overridepublic void onWeChatShare(int code, String msg) {//分享回调,官方目前取消了回调,不管是否正确分享都会进入。if (code==WeChatConstants.SUCCEED){//成功}if (code==WeChatConstants.CANCEL){//取消}}});builder.build();