Amdroid中微信支付遇到的问题

来源:互联网 发布:手机版 淘宝 人工客服 编辑:程序博客网 时间:2024/06/05 11:06
官网文档
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5
官网demo

https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=11_1

官方文档

Android开发要点说明

1、后台设置

商户在微信开放平台申请开发应用后,微信开放平台会生成APP的唯一标识APPID。由于需要保证支付安全,需要在开放平台绑定商户应用包名和应用签名,设置好后才能正常发起支付。设置界面在【开放平台】中的栏目【管理中心 / 修改应用 / 修改开发信息】里面,如图8.8红框内所示。

修改开发信息

图8.8

应用包名:是在APP项目配置文件AndroidManifest.xml中声明的package值,例如DEMO中的package="net.sourceforge.simcpux"。

应用签名:根据项目的应用包名和编译使用的keystore,可由签名工具生成一个32位的md5串,在调试的手机上安装签名工具后,运行可生成应用签名串,如图8.9所示,绿色串即应用签名。签名工具下载地址https://open.weixin.qq.com/zh_CN/htmledition/res/dev/download/sdk/Gen_Signature_Android.apk

修改开发信息

图8.9

2、注册APPID

商户APP工程中引入微信JAR包,调用API前,需要先向微信注册您的APPID,代码如下:

final IWXAPI msgApi = WXAPIFactory.createWXAPI(context, null);

// 将该app注册到微信

msgApi.registerApp("wxd930ea5d5a258f4f");

3、调起支付

商户服务器生成支付订单,先调用统一下单API(详见第7节)生成预付单,获取到prepay_id后将参数再次签名传输给APP发起支付。以下是调起微信支付的关键代码:

IWXAPI api;

PayReq request = new PayReq();

request.appId = "wxd930ea5d5a258f4f";

request.partnerId = "1900000109";

request.prepayId= "1101000000140415649af9fc314aa427",;

request.packageValue = "Sign=WXPay";

request.nonceStr= "1101000000140429eb40476f8896f4c9";

request.timeStamp= "1398746574";

request.sign= "7FFECB600D7157C5AA49810D2D8F28BC2811827B";

api.sendReq(req);

注意:该sign生成字段名列表见调起支付API

4、支付结果回调

参照微信SDK Sample,在net.sourceforge.simcpux.wxapi包路径中实现WXPayEntryActivity类(包名或类名不一致会造成无法回调),在WXPayEntryActivity类中实现onResp函数,支付完成后,微信APP会返回到商户APP并回调onResp函数,开发者需要在该函数中接收通知,判断返回错误码,如果支付成功则去后台查询支付结果再展示用户实际支付结果。注意一定不能以客户端返回作为用户支付的结果,应以服务器端的接收的支付通知或查询API返回的结果为准。代码示例如下:

publicvoidonResp(BaseRespresp){
if(resp.getType()==ConstantsAPI.COMMAND_PAY_BY_WX){
Log.d(TAG,"onPayFinish,errCode="+resp.errCode);
AlertDialog.Builderbuilder=newAlertDialog.Builder(this);
builder.setTitle(R.string.app_tip);
}
}

回调中errCode值列表:

名称描述解决方案0成功展示成功页面-1错误可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。-2用户取消无需处理。发生场景:用户不支付了,点击取消,返回APP。
下面是我在开发中遇到的具体问题:

问题1后台设置



文档上说:下载一个工具填入包名即可生成

文档上说:应用签名由keystore文件决定

我们都知道keystore(AndroidStudio是jks文件,实质一样)文件是用来编译apk文件的,每台电脑上对应的keystore文件的内容都不一样,生成的签名也都不一样,那么一个keystore对应一个应用签名,生成一个apk文件,当不对应的时候就不能调起微信支付

那么应用签名和keystore(AndroidStudio是jks文件,实质一样)文件有什么关系?

我找到了我电脑上默认的keystore文件C:\Users\hengli\.android\debug.keystore

用命令行打开:

1打开CMD命令行进入本机安装的jdk下的bin目录

 cd C:\Program Files\Java\jdk1.8.0_31\bin


2打开debug.keystore

 keystore文件路径C:\Users\hengli\.android\debug.keystore

 命令行输入:keytool -list -v -keystore C:\Users\hengli\.android\debug.keystore -storepass android

 

  我的   应用签名是:d1e6229669b9ba9e1d8ff69a18967c34

   debug.keystore中证书指纹:MD5: D1:E6:22:96:69:B9:BA:9E:1D:8F:F6:9A:18:96:7c:34

   我们很明显的看到微信文档中说的签名就是debug.keystore中证书指纹:MD5值去掉冒号,并变成小写就行了

  在项目正式签名的时候使用AndroidStudio生成jks文件,在用jks生成apk,我们只要根据jks文件中的MD5,改一下应用签名就好了

  jks文件还是用上面的命令打开,只是把 C:\Users\hengli\.android\debug.keystore换成自己jks的路径就好了

问题2支付结果回调

   文档上说:参照微信SDK Sample,在net.sourceforge.simcpux.wxapi包路径中实现WXPayEntryActivity类(包名或类名不一致会造成无法回调)

    实际上我测试了只要WXPayEntryActivity只要放在wxapi包下,wxapi包放在自己程序的主包名下


    





0 0
原创粉丝点击