Android微信支付

集成步骤

先贴上官方文档的集成步骤

资源链接
微信支付所需要的资源文件(包含支付demo和签名生成工具)

集成步骤链接
按照官方文档,一步一步集成下去,你会发现一个接一个-1等着你。

导入依赖库(jar包)

  • 导入相关文件,在eclipse上是导入jar包,在AS环境中,可以再build.gradle文件中,添加如下依赖即可
1
2
3
4
5
6
7
8
dependencies {
//包含统计功能
compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
}
或者
dependencies {
compile 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'
}
  • 当然也还可以用导入jar包的方式,下载demo文件,找到libammsdk.jar,导入到自己的项目libs文件夹中(解压压缩包,在libs文件夹中找到libammsdk.jar)

资源下载

下载地址同上面的资源链接,之后同步工程,jar包导入工作就算完成了。

添加WXPayEntryActivity文件(微信结果回调的类)

WXPayEntryActivity是微信支付结果的回调类,调用微信支付SDK之后返回的结果,都会此类中获取到,根据集成要求,此类必须放在指定的位置。

回调类的位置

如上图WXPayEntryActivity必须放在这个路径下面(在Project目录结构下 mainjava自己的包名wxapiWXPayEntryActivity),如果集成过微信分享,放置的文件位置是一样的。
然后在清单文件(AndroidManifest)中加入WXPayEntryActivity的相关配置

1
2
3
4
5
6
7
8
9
10
11
12
13
<!--微信支付-->
<activity
android:name=".wxapi.WXPayEntryActivity"
android:exported="true"
android:launchMode="singleTop"
android:theme="@style/Theme.AppCompat.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="you appid"/>
</intent-filter>

</activity>

看一下里面的内容

onCreat内容

在onCreat方法中,有一个布局文件,你可以自定义,微信支付调起以后,你想展示怎样的界面,如何告知用户,都可以在WXPayEntryActivity中展示,当然,也可以注释掉,不使用任何布局,获取到支付结果后,做相应的处理就行。
下面是获取支付结果的方法:

支付结果返回码

demo中给出的onResp方法,会将支付结果以弹窗的形式显示出来。当然你可以根据不同的状态码做不同的操作,
仅供参考(code 0、支付成功 -1、支付失败 -2、取消支付)

状态处理

你可以根据不同的状态做相应的处理,文档也对三种状态有对应的解释:

文档code说明

其中支付失败,返回-1的场景有很多,后面再详细说明。

调用微信支付

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private void toWeChatPay(OrderModel orderModel) {
IWXAPI wxapi = WXAPIFactory.createWXAPI(this, Const.WECHAT_PAY_APP_ID);
if (wxapi.isWXAppInstalled()) {//判断是否安装微信
wxapi.registerApp(Const.WECHAT_PAY_APP_ID);//把app注册到微信
//给PayReq赋值
PayReq req = new PayReq();
req.appId = Const.WECHAT_PAY_APP_ID;
req.partnerId = orderModel.partnerId;
req.prepayId = orderModel.prepayId;
req.packageValue = orderModel.packageValue;
req.nonceStr = orderModel.nonceStr;
req.timeStamp = orderModel.timeStamp;
req.sign = orderModel.sign;
//发起请求 调用微信支付
wxapi.sendReq(req);

} else {
ToastUtil.showToast(activity, "请您先安装微信!");
}
}

调用时的七个参数,可以查看具体的文档说明

参数

这些个参数,可以跟后台沟通,返回给我们使用,当然其中的appid可以定义成静态的全局变量,在使用之前最好做一下非空判断。

调用返回-1分析

以上步骤如果你已经全部完成,那么恭喜你集成算是成功了,接下来将是调用迎来的errCode = -1,在文档上,对于-1的解释是这样的:

可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等

对以上提到的错误原因我们一一分析:

首先说说签名错误

签名如何获取?根据文档提供的下载链接,下载签名工具,输入包名,生成app唯一的签名,在文档上有详细的说明,但是要注意生成的签名,debug包和release包生成的签名是不一样的,所以在微信开放平台中填写的签名一定要区分,在测试阶段使用的是debug包生成的签名,上线使用的必须是release包生成的签名,一句话,应用包和签名一致,如果签名不一致,就会造成支付失败,errCode返回-1的情况。如果集成的有微信分享,可以用微信分享验证签名是否正确,如果同一签名下,微信分享可以分享成功,那么微信支付的签名一定是对的,返回-1就从其他方面找原因。

APPID错误

APPID是微信开放平台给应用分配的,从上面复制就行,可以把APPID放在本地(一般不会变的),在AndroidManifast中、调用微信支付、WXPayEntryActivity等都会用到APPID。

参数错误

APPID和签名都正确的情况,再去调用微信支付。可能会出现这样的情况:如果微信未登录的情况下,会把微信调起来,在登录的情况下,返回值还是-1,这时候就要考虑参数的问题了,从demo里面拿过来的appid和一系列参数,放到自己的项目里面是不行的,参数要使用自己的appid对应生成的参数才可以,调用起微信。

-------------The End-------------