## 一、導入開發資源
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](http://www.hmoore.net/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 | 存在微信支付所需參數為空 |