当前位置: 美高梅集团手机版 > 美高梅集团 > 正文

吐槽微信文档的朋友不少,与是抽时间记录一下

时间:2019-09-30 15:31来源:美高梅集团
777.png 本文档旨在指导开发者快速集成微信APP支付,包括开发者帐号申请、服务器配置以及安卓端配置。 2、调起支付接口 下面是请求调用微信支付所需要的参数列表 注意:这些都是后

澳门美高梅游戏 1777.png

本文档旨在指导开发者快速集成微信APP支付,包括开发者帐号申请、服务器配置以及安卓端配置。

2、调起支付接口

下面是请求调用微信支付所需要的参数列表注意:这些都是后台传的,尤其这个签名字符串,最好是后台生成,如果你们服务器大哥不管,你最好找他喝点小酒,唠唠嗑

调用统一下单接口需要美高梅集团手机版,验签,收到返回结果之后,还需要将APP调起支付所需要的参数再次验签,然后再返回给APP端,在APP端调起支付即可。

常见坑位收集

Android微信支付彻底扫坑Android 微信支付详解与坑Android常见问题

4、创建微信支付回调的类WXPayEntryActivity注意:这个类的包名和目录结构,必须是你的项目的一级包名 >>wxapi >>WXPayEntryActivity

如图:填写各项参数,点击生成签名,然后将生成的#4.最终的提交xml的内容提交给统一支付下单接口即可。

这里我大致用自己的理解把App客户端的流程分为四步

这个类中你可以加入支付成功或者失败后的布局,如果你不需要展示什么布局,而是要跳转页面,把setContentView删除即可

澳门美高梅游戏 2申请微信支付

APP端调起支付的参数列表

 @Override public void onResp(BaseResp resp) { int errCode = resp.errCode; Log.i(TAG, "errCode:---->" + errCode); String result = ""; switch  { case 0: Log.i(TAG, "onResp:支付成功"); result = "支付成功"; tvTitle.setText; break; case -1: //可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。 Log.i(TAG, "onResp:支付失败"); result = "支付失败,请重试"; finish(); break; case -2: //用户取消支付 Log.i(TAG, "onResp:用户取消支付"); result = "您取消了支付"; finish(); break; } ToastUtils.showToast(this, result); }

澳门美高梅游戏,商户系统先调用该接口在微信支付服务后台生成预支付交易单,返回正确的预支付交易回话标识后再在APP里面调起支付。

4、微信客户端回调支付结果处理

我是直接copy的官网demo里面WXPayEntryActivity类的,然后根据自己的需要删除了一些不必要的东西。其实我们可以安装微信官网给的demo和文档编写我们自己打WXPayEntryActivity,我的示例如下:

public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler{ private IWXAPI api; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); api = WXAPIFactory.createWXAPI(this, Constants.APP_ID, false); try { api.handleIntent(getIntent; } catch (Exception e) { e.printStackTrace(); } } @Override protected void onNewIntent(Intent intent) { super.onNewIntent; setIntent; api.handleIntent(intent, this); } @Override public void onReq(BaseReq req) { } @Override public void onResp(BaseResp resp) { int result = 0; //有时候支付结果还需要发送给服务器确认支付状态 if (resp.getType()== ConstantsAPI.COMMAND_PAY_BY_WX){ if (resp.errCode==0){ Toast.makeText(this,"支付成功",Toast.LENGTH_LONG).show(); }else if (resp.errCode==-2){ Toast.makeText(this,"取消支付",Toast.LENGTH_LONG).show(); }else { Toast.makeText(this,"支付失败",Toast.LENGTH_LONG).show(); } finish(); } }}

errCode说明如下:

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

怎么还没有讲怎么调起微信客户端进行支付啊?有读者不开心了,别急,因为无论是微信支付还是支付宝支付,调用支付都不是很复杂的,这就给大家到来。

澳门美高梅游戏 3交互时序图

3、跳转微信进行支付

根据上面获取到的服务端的还回数据,调起微信支付,代码实例如下:

@Override public void wxpay(Context context, WXPayRsp wxPayRsp, IPayListener iPayListener) { this.iPayListener = iPayListener; IWXAPI api= WXAPIFactory.createWXAPI(context, Constants.APP_ID); api.registerApp(Constants.APP_ID); PayReq payReq=new PayReq(); payReq.appId=Constants.APP_ID; payReq.partnerId=wxPayRsp.getPartnerid(); payReq.prepayId=wxPayRsp.getPrepayid(); payReq.packageValue="Sign=WXPay"; payReq.nonceStr=wxPayRsp.getNoncestr(); payReq.timeStamp=wxPayRsp.getTimestamp(); payReq.sign=wxPayRsp.getSign(); api.sendReq; }

具体请求参数如下:

澳门美高梅游戏 4调起支付接口参数

每次调用微信支付的时候都会校验 appid 、包名 和 应用签名的。 这三个必须保持一致才能够成功调起微信!!! (这个bug害我浪费一下午时间!api.sendReq接口,返回true,但微信客户端并未启动,后来产品给后台的appid和给我的不同才知道错误在这)

private void wxPay(WxPayBean wxPayBean){ //WxPayBean是我自己项目的服务器返回的微信支付签名的数据,这个需要你和你们公司后台对接 WxPayBean.ResultBean result = wxPayBean.getResult(); //调用API前,需要先向微信注册您的APPID IWXAPI wxAPI = WXAPIFactory.createWXAPI(this, MainConstant.Cart.APP_ID); wxAPI.registerApp(result.getAppid; // 将该app注册到微信 PayReq req = new PayReq(); req.appId = result.getAppid(); //微信开放平台审核通过的应用APPID req.partnerId = result.getPartnerid(); //商户号 req.prepayId = result.getPrepayid(); //微信返回的支付交易会话ID req.packageValue = "Sign=WXPay"; //固定值Sign=WXPay req.nonceStr = result.getNoncestr(); //随机字符串 req.timeStamp = result.getTimestamp(); //时间戳 req.sign = result.getSign(); //签名 //调起微信支付 wxAPI.sendReq;}

微信提供了在线验证签名,以检测开发者调用微信公众平台开发者API时发送的请求参数是否正确

填坑日记

  • 因为业务调整,公司微信接口改变,加上一些其他app的变更。发现之前明明好好通过支付的,结果出现了问题。还回错误为-1。后来换个测试机一搞就通过了,在测试机中引起微信支付失败的原因竟然是,缓存没有清空导致的。因为包名是一致,然后我的app里面还是用到了webview内嵌。心里有句mmp不知道当讲不当讲
  • 发正式宝的时候微信开发平台填写的签名改了之后,微信掉不起来,后来同样卸载微信就好了。这句mmp我一定要讲

下面是回调的结果码

必传参数:

进入微信支付页面后可以能会有:输入密码支付,取消支付,支付失败等操作

澳门美高梅游戏 5WXPayEntryActivity.png

APP支付又称移动端支付,是商户通过在移动端应用APP中集成开放SDK调起微信支付模块完成支付的模式。

首先一定要清楚微信支付业务流程,这样接下来就事半功倍了。主要官方文档看这:

或者:微信支付依赖包 >>> libammsdk.jar,这个需要下载微信支付的demo,把libs下的这个jar包拷贝到你的项目即可。

确认debug或者打包运行的程序签名与微信开发平台设置的签名一致(使用下面任意一种方法):①、可以设置后台的签名为debug包的签名,这样每次直接运行即可,待程序发布之前再将签名修改为正式包的签名②、若使用的正式包的签名,则每次都要打包运行,或者可以在build.gradle中的android标签中添加下面的代码:

澳门美高梅游戏 6微信支付业务流程

2.申请支付能力在管理中心,查看需要集成支付能力的app,找到“微信支付”一栏,点击右侧“申请开通”,填写一些企业信息后等待审核,审核时间为一周左右,审核通过后,会得到一个企业商户号及密码,对公银行卡中将收到几分钱,进入商户平台,输入收到的金钱金额以验证。验证通过后即可开始集成支付调用。在这之前,调用支付接口是无法完成支付的。

澳门美高梅游戏 7再次验签

1、统一下单

3、添加gradle依赖或者jar包在build.gradle文件中,添加如下依赖即可:

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

  • 业务流程
  • APP端开发步骤
  • Android资源下载
  • API列表

下面是微信开放平台,你的应用签名,这个东西,很多人容易弄错,这个一旦错了,就调不起微信支付的界面了,详情请移步我的另一篇博客安卓第三方登录之微信登录

IWXAPI msgApi;msgApi = WXAPIFactory.createWXAPI(this, null);msgApi.registerApp("wxdf5a5e8166b65d8e");// 将该app注册到微信

客户端将支付信息上传给公司服务端。首先根据具体公司的需求,上传支付信息给服务端,然后接收服务端还回结果。我们客户端只需要发送相应的请求提给服务端即可。更多具体内容参考微信APP支付文档-统一下单

当然,你也可以参考微信官方APP开发步骤

<activity android:name=".wxapi.WXPayEntryActivity" android:exported="true" android:launchMode="singleTop"/>

业务流程如下:

首先,给出官方文档的地址(需要的朋友,自行阅读下载)1、微信官方的Android集成文档2、微信官方APP端开发步骤3、微信官方资源下载

实际支付结果一定不能以客户端返回作为用户支付的结果,应以服务器端的接收的支付通知或查询API返回的结果为准。

1、引入微信支付资源

1、引入微信支付依赖

在build.gradle文件中,添加如下依赖即可:

dependencies { compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'}

详情参考Android资源下载

2、配置WXPayEntryActivity

1、首先我们下载下来官网的demo然后copy其中的一个WXPayEntryActivity类放到 app包下新建一个wxapi包 里面。

注意是WXPayEntryActivity不是WXEntryActivity,WXEntryActivity是微信分享的, WXPayEntryActivity才是支付的

这个页面是在你调起微信支付完成支付后,再回到你的App时会调用的一个页面。请务必保证在你项目下他的结果目录为:**开放平台绑定的商户应用包名

  • wxapi + WXPayEntryActivity**

澳门美高梅游戏 8开放平台绑定的商户应用包名

2、AndroidManifest.xml中注册

 <!--wx pay所需权限--> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <!--wx pay--> <activity android:name=".wxapi.WXPayEntryActivity" android:exported="true" android:launchMode="singleTop"/>

3、发送支付信息给服务端

跟服务端协调需要我们客户端传递什么信息过去。详细请求参数参考API列表-统一下单我这里,只需要传递一些和服务端协商好的数据,其他金额等都是在服务端处理好的。然后服务端还回预支付交易给我们客户端

 WXPayReq wxPayReq=new WXPayReq(); wxPayReq.setUser_id; wxPayReq.setChannel_id(Channel_id); wxPayReq.setGoods_id;

编辑:美高梅集团 本文来源:吐槽微信文档的朋友不少,与是抽时间记录一下

关键词: