## 一、导入开发资源 1. 下载SQPaySdk-Android-xxx.jar包。在壹收银开放平台下载SQPaySdk-Android-xxx.zip资源并解压,SQpaySdk-xxx.jar在libs中。 <br/> 2. 以Android studio为例,将SQpaySdk-xxx.jar包导入module下libs文件夹 <br/> 3. 右击SQpaySdk-xxx.jar选择Add As Library...添加jar包依赖 4. 按applicationId.wxapi.WXPayEntryActivity格式在applicationId包名对应的文件夹下创建文件夹wxapi,并在文件夹下添加类名为WXPayEntryActivity.class的类,且必须extend SQWXPayEntryActivity类。 &ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;**注意一定按applicationId.wxapi.WXPayEntryActivity格式创建,否则微信支付结果将无法回调。** <br/> <br/> <br/> * * * * * ## 二、修改Manifest.xml 1. 声明WXPayEntryActivity,配置ACCESS ID: ~~~ <!-- 微信支付结果回调界面,注意:
 1、类名为WXPayEntryActivity,不能更改
 2、路径为package.wxapi.WXPayEntryActivity,不能更改
 否则将无法回调,将demo中的配置copy使用即可-->
<activity android:name=".wxapi.WXPayEntryActivity"
 android:exported="true"
 android:launchMode="singleTop"/> ~~~ <br/> 2. 添加权限: ~~~ <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" /> ~~~ <br/><br/> ## ## 三、添加混淆规则 ~~~ -keep class io.youyi.pay.SQPayApi {*;}
-keep class io.youyi.pay.SQPayRequest {*;}
-keep class io.youyi.pay.SQPayResult {*;}
-keep class io.youyi.pay.SQPayResultListener{*;}
-keep class io.youyi.pay.SQWXPayEntryActivity{*;} 

-keep class com.alipay.**
-keep class com.tencent.mm.opensdk.**
-keep class com.tentent.**

-dontshrink
-dontpreverify
-dontoptimize
-dontusemixedcaseclassnames

-flattenpackagehierarchy
-allowaccessmodification
-printmapping map.txt

-optimizationpasses 7
-verbose
-keepattributes Exceptions,InnerClasses
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-ignorewarnings

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends java.lang.Throwable {*;}
-keep public class * extends java.lang.Exception {*;}

-keep class com.alipay.android.app.IAlixPay{*;}
-keep class com.alipay.android.app.IAlixPay$Stub{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;}
-keep class com.alipay.sdk.app.PayTask{ public *;}
-keep class com.alipay.sdk.app.AuthTask{ public *;}
-keep class com.alipay.sdk.app.H5PayCallback {
 <fields>;
 <methods>;
}
-keep class com.alipay.android.phone.mrpc.core.** { *; }
-keep class com.alipay.apmobilesecuritysdk.** { *; }
-keep class com.alipay.mobile.framework.service.annotation.** { *; }
-keep class com.alipay.mobilesecuritysdk.face.** { *; }
-keep class com.alipay.tscenter.biz.rpc.** { *; }
-keep class org.json.alipay.** { *; }
-keep class com.alipay.tscenter.** { *; }
-keep class com.ta.utdid2.** { *;}
-keep class com.ut.device.** { *;}


-keepclasseswithmembernames class * {
 native <methods>;
}

-keepclasseswithmembers class * {
 public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembers class * {
 public <init>(android.content.Context, android.util.AttributeSet, int);
}

-keepclassmembers class * extends android.app.Activity {
 public void *(android.view.View);
}

-keepclassmembers enum * {
 public static **[] values();
 public static ** valueOf(java.lang.String);
}

-keep class * implements android.os.Parcelable {
 public static final android.os.Parcelable$Creator *;
}
# adding this in to preserve line numbers so that the stack traces
# can be remapped
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable ~~~ <br/> <br/> ## ## 四、检查签名配置 &ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;检查build.gradle是否添加签名,并且与微信开放平台注册app时填写的一致。 &ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;至此,开发包开发资源导入完成,详细使用见资源包中的demo。 <br/> <br/> ## ## 五、支付接口调用 1. 初始化支付sdk ~~~ // 初始化配置,填写壹收银开放平台注册时获取的mchNo和client key SQPayApi.init("your_mch_no","your_client_key" ); 发起支付请求 // 创建支付请求
SQPayRequest request = new SQPayRequest();
 // 订单名称(必填)
 request.setBody("支付测试");
 // 支付金额,单位:分(必填)
 request.setFee(1);
 // 商家订单号(必填)
 request.setMchOrderId("123456");
 // 订单支付结束后异步回调通知url(必填)
 request.setNotifyUrl("http://www.baidu.com");
 // 订单附加信息(选填)
 request.setAttach("附加信息");
 // 支付渠道:微信/支付宝
 request.setPayChannel(SQPayRequest.CHANNEL_ALIPAY);
 //request.setPayChannel(SQPayRequest.CHANNEL_WEIXIN);
 // 发起支付,并添加支付结果监听
 // 发起支付请求
SQPayApi.pay(this, request, new SQPayResultListener() {
 @Override
 public void onSuccess(SQPayResult sqPayResult) {
 Toast.makeText(PayDemoActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
 }

 @Override
 public void onFail(String errorCode, String errorDes) {
 if (errorCode.equals(SQPayResult.FAIL)) {
 Toast.makeText(PayDemoActivity.this, "支付失败", Toast.LENGTH_SHORT).show();
 } else if (errorCode.equals(SQPayResult.CANCEL)) {
 Toast.makeText(PayDemoActivity.this, "用户取消支付", Toast.LENGTH_SHORT).show();
 }
 }
}); ~~~ 【注:[获取mchNo和client key](https://www.kancloud.cn/book/cattong/youyisdk/preview/%E6%B3%A8%E5%86%8C%E5%BC%80%E5%8F%91%E8%80%85%E8%B4%A6%E5%8F%B7.md)】 <br/> <br/> ## ## 六、接口说明 Android平台上的快捷支付开发包接口如下表所示: 1、SQPayRequest.class | 接口名称 | 接口描述 | | --- | --- | | SQPayRequest | 开发包提供,封装商品订单信息。 | &ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;方法声明:getXX()和setXX() | 参数名称 | 参数类型 | 必填 | 说明 | | --- | --- | --- | --- | | body | String | 是 | 订单名称 | | fee | Int | 是 | 订单金额,单位分 | | mchOrderId | String | 是 | 自定义订单号 | | notifyUrl | String | 是 | 异步通知的地址,服务器在支付完成后,会以POST方式调用notify_url传输数据 | | attach | String | 否 | 订单附加信息 | | payChannelv | Int | 是 | 支付渠道,1:微信;2:支付宝 | | orderId | String | 否 | 平台生成的订单号,在支付结束后返回,不需要填写 | **常量** | CHANNEL_WEIXIN | 微信支付渠道 | | --- | --- | | CHANNEL_ALIPAY | 支付宝支付渠道 | <br/> <br/> 2、SQPayResult.class | 接口名称 | 接口描述 | | --- | --- | | SQPayResult | 开发包提供,支付成功后返回的支付订单信息。 | 方法声明:getXX()和setXX() <br/> | 参数名称 | 参数类型 | 必填 | 说明 | | --- | --- | --- | --- | | body | String | 是 | 订单名称 | | fee | Int | 是 | 订单金额,单位分 | | mchOrderId | String | 是 | 自定义订单号 | | notifyUrl | String | 是 | 异步通知的地址,服务器在支付完成后,会以POST方式调用notify_url传输数据 | | attach | String | 否 | 订单附加信息 | | payChannel | Int | 是 | 支付渠道,1:微信;2:支付宝 | | orderId | String | 否 | 平台生成的订单号,在支付结束后返回,不需要填写 | ### **常量** | CHANNEL_WEIXIN | 微信支付渠道编码 | | --- | --- | | CHANNEL_ALIPAY | 支付宝支付渠道编码 | <br/> <br/> ### 3、SQPayResultListener.class | 接口名称 | 接口描述 | | --- | --- | | SQPayResultListener | 开发包提供,支付结果监听接口 | <br/> <br/> #### 接口方法声明: | 支付成功接口与参数 | 说明 | | --- | --- | | SQPayResultListener.OnSuccess(SQPayResult result) | 支付成功监听接口 | | SQPayResult | 支付结果,包含订单信息 | | 支付失败接口与参数 | 说明 | | --- | --- | | SQPayResultListener.OnFail(String errorCode, String errorDes) | 支付失败监听接口 | | errorCode | 错误码 | | errorDes | 错误描述 | <br/> <br/> 4、SQPayApi.class | 接口名称 | 接口描述 | | --- | --- | | SQPayApi | 开发包提供,支付相关请求 | <br/> | 方法SQPayApi.init() | 说明 | | --- | --- | | SQPayApi.init(String mchNo,String clientKey) | 配置商户信息 | | mchNo | 商户号,注册账号后本平台内获取 | | clientKey | 访问id,注册账号后本平台内获取 | <br/> <br/> | 方法SQPayApi.pay() | 说明 | | --- | --- | | SQPayApi.RequestPay(Activity activity, SQPayRequest request, SQPayResultListener listener) | 发起支付请求 | | Activity | | | SQPayRequest | | | SQPayResultListener | | <br/> <br/> ## ## 七、APP支付新手入门及常见问题 1. 微信支付无法显示付款界面 请检查以下方面: * 当前App已添加签名; * 签名与微信开放平台注册app时填写一致; <br/> 2. 微信支付成功后回调失败 请检查以下方面: * 当前app模块src—>main—>java下的包名是否与签名所用包名一致; * 检测包名方法:退出微信登录,点击你App的微信支付,显示微信登录界面后返回,回调正常;登录微信,重复上述,支付成功后回调失败。 3. 微信返回-1 * 可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。 4. 支付宝支付失败 [支付宝公共返回码](https://doc.open.alipay.com/doc2/detail.htm?treeId=200&articleId=105351&docType=1#s2) [支付宝Ali错误码](https://tech.open.alipay.com/support/knowledge/index.htm?categoryId=24120&tabId=270052&scrollcheck=1#/?_k=fyysbb) <br/> ## ## 八、附录 | 错误码 | 参数名称 | | --- | --- | | 1100 | 网络出现异常 | | 1102 | 网络出现异常,请确认网络是否稳定 | | 40001 | 未填写accessKey | | 40002 | 服务端返回数据出错 | | 40003 | GoodOrder未填写完整 | | 40004 | 微信未安装 | | 40005 | 微信版本过低,请先更新微信 | | 40006 | 微信接口IWXAPI调用失败 | | 40007 | 存在微信支付所需参数为空 |