调起微信支付注意事项及问题

本文围绕APP(android)内调起微信支付的开发需求展开。开发中遇到官方demo为eclipse版本、gradle配置问题等,还介绍了gradle配置及调起支付的步骤。此外,针对支付时出现首次成功后续返回 -1 的问题,给出卸载重装或清除缓存的解决办法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开发需求是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)重新安装微信后试试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值