开发需求是APP(android)内调起微信支付,然而调用过程是那么艰辛,本以为微信官方的demo运行起来就可以了,可以连运行起来都发现是件很困难的事情,官方给的demo,是eclipse版本的,可现在还有人eclipse开发android吗?然后导入的时候也没看,直接用android studio的gradle版本3.0+,然后就悲催了,排错排了快一天,就连发送请求都不通,请求的参考(https://blog.youkuaiyun.com/xiejunna/article/details/90180488)!
这里贴一下gradle的配置吧
Project中的gradle(gradle版本看自己的环境是什么就配置什么)
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
jcenter()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.1.0'
}
}
allprojects {
repositories {
google()
jcenter()
mavenCentral()
}
}
app中的gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 27
buildToolsVersion "28.0.3"
//2018年已经废除这个东西了。
//其实AAPT2的错误并不复杂,90%以上都是你的资源文件出了问题,我们可以先尝试在app下面的build中加上两个配置属性
//关闭AS校验我们的资源文件,或者说是PNG等图片
aaptOptions.cruncherEnabled = false
aaptOptions.useNewCruncher = false
defaultConfig {
multiDexEnabled true
useLibrary "org.apache.http.legacy"
applicationId "com.a.b.c"
minSdkVersion 26
targetSdkVersion 26
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
}
dependencies {
// implementation files('libs/libammsdk.jar')
implementation files('libs/wechat-sdk-android-with-mta-1.0.2.jar')
implementation 'org.json:org.json:chargebee-1.0'
implementation 'commons-lang:commons-lang:20030203.000129'
}
然后:
0.修改项目包名为自己的包名,后续此包名会填写到开放平台
1.Constants.java里的APP_ID修改为自己的appid,PayActivity.java调起支付的时候,会先创建api实例,后续调起支付控件用
2.把下单的url路径改为请求自己服务器的路径,是get、post根据自己需要调整
3.调起支付控件,这一步就调用微信sdk封装方法,参数是第二步请求回来的参数,自己根据下单接口返回字段计算签名
PayReq req = new PayReq();
req.appId = appId;
req.partnerId = partnerId;
req.prepayId = prepayId;
req.nonceStr = nonceStr;
req.timeStamp = timeStamp;
req.packageValue = package;
req.sign = hmacSha256;//计算签名用的key为商户平台设置的秘钥(这里不是开放平台了)
req.extData = extData; // optional
Toast.makeText(PayActivity.this, "正常调起支付", Toast.LENGTH_SHORT).show();
// 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信
boolean payRes = api.sendReq(req);
Log.i("PAY_POST", "支付结果:" + payRes);
4.WXPayEntryActivity.java中的onResp()中是微信支付结果
@Override
public void onResp(BaseResp resp) {
Log.d(TAG, "onPayFinish, errCode = " + resp.errCode);
Log.d("PAY_POST", "onPayFinish, errCode = " + resp.errCode);
if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.app_tip);
builder.setMessage(getString(R.string.pay_result_callback_msg, String.valueOf(resp.errCode)));
builder.show();
}
}
5.demo打release版本(不能是debug版本),到手机运行
6.在开放平台填写自己的包名与应用签名,应用签名官方有GenSignature.apk生成,但前提是手机上要先安装微信支付demo,release版本的apk,签名工具GenSignature.apk是要获取微信支付demo应用包名的,生成一个32位的签名key
7.把demo的包名、生成的签名填写到开放平台对应包名与签名的位置
8.运行,调试,这时遇到了一个问题,同一个手机只能第一次调起支付,且能支付成功,第二次以后都是返回-1,各种找办法,最终有效的方法是:卸载微信重新安装,或者 设置—>应用管理器—>微信—>存储—>清除缓存(有时候清除缓存不管用,还是微信直接卸载重新安装有用)
这种第一次支付成功,以后每次都-1的情况,微信官方这么解释的:
微信支付技术助手 官
您好,请仔细检查:
1)你签名中的key,也就是你的API密钥key,这个参数要你们自己到商户平台设置的,设置的规则是32位数字与字母大小写的组合的随机数,
不能设置成签名串和参数appsecret,你们有正确设置吗???
2)检查开放平台对应的包名与签名是否有正确设置。
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5 这里有详细的设置说明。
3)调用支付使用的noncestr这个参数必须和商家服务器调用统一下单接口返回的那个noncestr一致
4)从预支付订单返回的数据 ,没有重新签名,也会引起这个问题。
5)重新安装微信后试试。