# 一、导入开发资源

    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

  1. 声明WXPayEntryActivity,配置ACCESS ID:
<!-- 微信支付结果回调界面,注意:
	1、类名为WXPayEntryActivity,不能更改
	2、路径为package.wxapi.WXPayEntryActivity,不能更改
	否则将无法回调,将demo中的配置copy使用即可-->
<activity android:name=".wxapi.WXPayEntryActivity"
		android:exported="true"
		android:launchMode="singleTop"/>
  1. 添加权限:
<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。

# 五、支付接口调用

  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

# 六、接口说明

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. 微信返回-1
  • 可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。
  1. 支付宝支付失败 支付宝公共返回码 (opens new window) 支付宝API公共错误码 (opens new window)

# 八、附录

错误码
参数名称
1100 网络出现异常
1102 网络出现异常,请确认网络是否稳定
40001 未填写accessKey
40002 服务端返回数据出错
40003 GoodOrder未填写完整
40004 微信未安装
40005 微信版本过低,请先更新微信
40006 微信接口IWXAPI调用失败
40007 存在微信支付所需参数为空