# 一、导入开发资源
1. 下载SQPaySdk-Android-xxx.jar包。在壹收银开放平台下载SQPaySdk-Android-xxx.zip资源并解压,SQpaySdk-xxx.jar在libs中。
2. 以Android studio为例,将SQpaySdk-xxx.jar包导入module下libs文件夹。
3. 右击SQpaySdk-xxx.jar选择Add As Library...添加jar包依赖。
4. 按applicationId.wxapi.WXPayEntryActivity格式在applicationId包名对应的文件夹下创建文件夹wxapi,并在文件夹下添加类名为WXPayEntryActivity.class的类,且必须extend SQWXPayEntryActivity类。
注意一定按applicationId.wxapi.WXPayEntryActivity格式创建,否则微信支付结果将无法回调。
# 二、修改Manifest.xml
- 声明WXPayEntryActivity,配置ACCESS ID:
<!-- 微信支付结果回调界面,注意:
1、类名为WXPayEntryActivity,不能更改
2、路径为package.wxapi.WXPayEntryActivity,不能更改
否则将无法回调,将demo中的配置copy使用即可-->
<activity android:name=".wxapi.WXPayEntryActivity"
android:exported="true"
android:launchMode="singleTop"/>
- 添加权限:
<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" />
# 三、添加混淆规则
-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
# 四、检查签名配置
检查build.gradle是否添加签名,并且与微信开放平台注册app时填写的一致。
至此,开发包开发资源导入完成,详细使用见资源包中的demo。
# 五、支付接口调用
- 初始化支付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();
}
}
});
# 六、接口说明
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 | 支付宝支付渠道 |
# 2、SQPayResult.class
接口名称 | 接口描述 |
---|---|
SQPayResult | 开发包提供,支付成功后返回的支付订单信息 |
方法声明:getXX()和setXX()
参数名称 | 参数类型 | 必填 | 说明 |
---|---|---|---|
body | String | 是 | 订单名称 |
fee | Int | 是 | 订单金额,单位分 |
mchOrderId | String | 是 | 自定义订单号 |
notifyUrl | String | 是 | 异步通知的地址,服务器在支付完成后,会以POST方式调用notify_url传输数据 |
attach | String | 否 | 订单附加信息 |
payChannel | Int | 是 | 支付渠道,1:微信;2:支付宝 |
orderId | String | 否 | 平台生成的订单号,在支付结束后返回,不需要填写 |
# 常量
CHANNEL_WEIXIN | 微信支付渠道编码 |
---|---|
CHANNEL_ALIPAY | 支付宝支付渠道编码 |
# 3、SQPayResultListener.class
接口名称 | 接口描述 |
---|---|
SQPayResultListener | 开发包提供,支付结果监听接口 |
# 接口方法声明:
支付成功接口与参数 | 说明 |
---|---|
SQPayResultListener.OnSuccess(SQPayResult result) | 支付成功监听接口 |
SQPayResult | 支付结果,包含订单信息 |
支付失败接口与参数 | 说明 |
---|---|
SQPayResultListener.OnFail(String errorCode, String errorDes) | 支付失败监听接口 |
errorCode | 错误码 |
errorDes | 错误描述 |
4、SQPayApi.class
接口名称 | 接口描述 |
---|---|
SQPayApi | 开发包提供,支付相关请求 |
方法SQPayApi.init() | 说明 |
---|---|
SQPayApi.init(String mchNo,String clientKey) | 配置商户信息 |
mchNo | 商户号,注册账号后本平台内获取 |
clientKey | 访问id,注册账号后本平台内获取 |
方法SQPayApi.init() | 说明 |
---|---|
SQPayApi.RequestPay(Activity activity, SQPayRequest request, SQPayResultListener listener) | 发起支付请求 |
Activity | |
SQPayRequest | |
SQPayResultListener |
# 七、APP支付新手入门及常见问题
# 1. 微信支付无法显示付款界面
请检查以下方面:
- 当前App已添加签名;
- 签名与微信开放平台注册app时填写一致;
# 2. 微信支付成功后回调失败
请检查以下方面:
- 当前app模块src—>main—>java下的包名是否与签名所用包名一致;
- 检测包名方法:退出微信登录,点击你App的微信支付,显示微信登录界面后返回,回调正常;登录微信,重复上述,支付成功后回调失败。
- 微信返回-1
- 可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。
# 八、附录
错误码 | 参数名称 |
---|---|
1100 | 网络出现异常 |
1102 | 网络出现异常,请确认网络是否稳定 |
40001 | 未填写accessKey |
40002 | 服务端返回数据出错 |
40003 | GoodOrder未填写完整 |
40004 | 微信未安装 |
40005 | 微信版本过低,请先更新微信 |
40006 | 微信接口IWXAPI调用失败 |
40007 | 存在微信支付所需参数为空 |