## 一、导入开发资源
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类。
       **注意一定按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/>
##
## 四、检查签名配置
       检查build.gradle是否添加签名,并且与微信开放平台注册app时填写的一致。
       至此,开发包开发资源导入完成,详细使用见资源包中的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 | 开发包提供,封装商品订单信息。 |
       方法声明: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 | 存在微信支付所需参数为空 |