Android App支付系列(一):微信支付接入详细指南(附官方支付demo)

写在前面

一家移动互联网公司,说到底,要盈利总是需要付费用户的,自己开发支付系统显然是不明智的,国内已经有多家成熟的移动支付提供商,腾讯就是其中之一。梳理了下微信支付的接入,今天给大家分享下腾讯旗下的微信支付SDK的接入流程。
接入流程

1.申请开发者资质

地址:https://open.weixin.qq.com/

使用公司管理者/高层帐号登录微信开放平台,进入“账号中心”,进行开发者资质认证,需要填写公司资料,包括但不限于,公司注册号,公司营业执照,公司对外办公电话,公司对公银行卡信息(卡号,发卡行)。审核时间为一周左右。

备注:因为从2015年10月1日起,国家实行三证(组织机构代码证,企业营业执照,税务登记证)合一,所以组织机构代码处填写-工商执照注册号,同样,组织机构代码证,上传-企业工商营业执照。

备注2:进行开发者资质认证需要支付300元人名币/年,只有具备开发者资质认证的开发者才能够使用app支付,授权登录等接口。

2.申请APP_ID/APP_KEY

每个应用/游戏要调用微信的接口都需要有一个微信标志,这个唯一标志通常成为APP_ID或者APP_KEY,各开放平台差异不大
 进入管理中心,创建移动应用,每个开发者具有10个应用的创建机会,好在创建的应用可以随时删除。已上线的应用就不建议手贱删除!!

申请appid需要填写应用信息:应用名称,包名,签名(keystore的md5值去分号小写),icon(28*28 & 108*108),app下载地址等信息,即可分配到一个appid。
 备注:测试支付时,务必使用申请时填写的keystore文件签名,包名也需要核对清楚,必然无法调起支付,返回-1错误码。

3.申请支付能力 

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

4.代码集成微信支付 

支付流程图

微信支付流程图白话版:

1.客户端代码得到用户购买的商品信息,将之传给自己公司app服务器,参数包含但不限于以下:

params.put("appid", appID);// 微信appid,选择性上传,服务器写死亦可
params.put("money", money);// 支付金额,单位:分
params.put("name", goodsName);// 商品名称
params.put("currencytype", "CNY");// 支付币种,只能填CNY,代表人民币

备注:以上是参数字段是我们公司服务器定义,给服务器用以获取预支付订单号prePayId用。

备注2:详细字段请参考:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1

2.app服务器调用微信“统一下单”接口,得到prePayId订单号并返回prePayId给手机客户端;

3.手机客户端使用prePayId及商品信息调起微信客户端进行支付;

3.1用户操作:输入密码进行支付;返回键取消支付;网络无连接支付失败等;

4.微信客户端回调支付结果给咱们的APP客户端;

5.微信服务器异步通知咱们公司app服务器支付结果(服务器的工作,与客户端无关)

微信支付代码:

IWXAPI mWxApi = WXAPIFactory.createWXAPI(mContext, WX_APPID, true);
mWxApi.registerApp(WX_APPID);
      /**
       * 请求app服务器得到的回调结果
       */
      @Override
      public void onGet(JSONObject jsonObject) {
        if (mWxApi != null) {
          PayReq req = new PayReq();

          req.appId = WX_APPID;// 微信开放平台审核通过的应用APPID
          try {
            req.partnerId = jsonObject.getString("partnerid");// 微信支付分配的商户号
            req.prepayId = jsonObject.getString("prepayid");// 预支付订单号,app服务器调用“统一下单”接口获取
            req.nonceStr = jsonObject.getString("noncestr");// 随机字符串,不长于32位,服务器小哥会给咱生成
            req.timeStamp = jsonObject.getString("timestamp");// 时间戳,app服务器小哥给出
            req.packageValue = jsonObject.getString("package");// 固定值Sign=WXPay,可以直接写死,服务器返回的也是这个固定值
            req.sign = jsonObject.getString("sign");// 签名,服务器小哥给出,他会根据:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=4_3指导得到这个
          } catch (JSONException e) {
            e.printStackTrace();
          }
          mWxApi.sendReq(req);
          Log.d("发起微信支付申请");
        }

      }

在app包下新建wxapi包,比如app包名为com.xiongit.app,那个新建的包路径为com.xiongit.app.wxapi,该包下新建WXPayEntryActivity,继承自任意Activity。该Activity用以接收支付结果回调,清单声明此Activity的格式为

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

WXPayEntryActivity代码示例

public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler{

  private static final String TAG = "MicroMsg.SDKSample.WXPayEntryActivity";

  private IWXAPI api;
  private static final String APP_ID = "your app id";

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.pay_result);

    api = WXAPIFactory.createWXAPI(this, APP_ID);
    api.handleIntent(getIntent(), this);
  }

  @Override
  protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent);
    api.handleIntent(intent, this);
  }

  @Override
  public void onReq(BaseReq req) {
  }

  /**
   * 得到支付结果回调
   */
  @Override
  public void onResp(BaseResp resp) {
    Log.d(TAG, "onPayFinish, errCode = " + resp.errCode);// 支付结果码
  }
}

回调中errCode值列表:

0 支付成功

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

-2 用户取消 发生场景:用户不支付了,点击取消,返回APP。

清单menifest申明所需权限

 <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"/>

备注:支付结果最终以app服务器的得到的异步通知为准。

微信SDK混淆

-keep class com.tencent.mm.sdk.** {
  *;
}

update 20160704

当支付时,微信尚未登录,得不到任何回调,如果调起支付时有弹窗进度框,并且你想在得到响应码后让它消失是行不通的,需要在跳出的onStop中处理进度条,不然未登录并且用户取消了支付时进度条无法消失。

update 20160722

当支付时,WXPayEntryActivity会以透明的形式启动,所以你可能需要在支付完成得到支付响应码后手动finish该activity,不然你自己写的支付页面的activity需要返回两次才能退出,因为第一次按下back键实际是finish掉WXPayEntryActivity.第二次才是你自己的activity.

完事了,祝各位集成微信支付成功!

最后附上微信官方支付demo下载:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=11_1,吐槽语:官方demo下载藏的有点深。。。开放平台居然没有提供下载,放在微信支付商户平台。

(0)

相关推荐

  • Android微信支付开发问题

    并不是所有的BAT的API都是非常好用的,微信支付就有不少的缺陷,总结一下微信支付实现中出现的问题   坑点一: PayReq的参数 sign的生成   PayReq对象有个参数为packageValue 而sign生成时要用到packageValue,但是对应的Key是package,这里的key容易弄错 复制代码 代码如下: List<NameValuePair> signParams = new LinkedList<NameValuePair>();         sig

  • Android 支付宝支付、微信支付、银联支付 整合第三方支付接入方法(后台订单支付API设计)

    客户端获取后台支付API请求参数的设计 参数样例: { data: { method: 1, platform: 1, version:"1.0", relate_orders:"B201602031023,B2016020310231", order_no: "BZY201604200952100", order_type: 1, total_fee: 1, description: "商品购买", client_ip:'1

  • 新版Android studio导入微信支付和支付宝官方Demo问题解决大全

    最近项目要用到支付宝支付和微信支付,本想使用第三方支付框架ping++或者BeeCloud的,但是由于他们的收费问题,让我望而却步,而且公司给了相应的公钥.私钥和APPID等,所以就用下开放平台的呗. 进去倒腾了半天才发现一堆问题,Oh,我的天.完全不知所云,百度谷歌了一堆,都没找到足够的解决方案.好吧,自己来,这里也就把相关的东西分享给大家,如果有类似问题的可以考虑使用一下,不足的地方大牛就别喷了. 微信开放平台有文档和SDK,大家可以去自己查看下载,火箭:https://open.weixi

  • Android高仿微信支付密码输入控件

    像微信支付密码控件,在app中是一个多么司空见惯的功能.最近,项目需要这个功能,于是乎就实现这个功能. 老样子,投篮需要找准角度,变成需要理清思路.对于这个"小而美"的控件,我们思路应该这样子. Ⅰ.将要输入密码数量动态通过代码加载出来. Ⅱ.利用Gridview模拟产生一个输入数字键盘,并且按照习惯从屏幕底部弹出来. Ⅲ.对输入数字键盘进行事件监听,将这个输入数字填入到这个密码框中,并且当您输入密码长度一致的时候,进行事件回调. 这个思维导图应该是这样的: 首先,我们要根据需求动态加

  • android微信支付源码分享

    本文为大家分享了android微信支付源码,供大家参考,具体内容如下 参数配置 public static final String APP_ID ; /** 在微信开放平台注册app,微信给分配的id **/ public static final String MCH_ID; /** 申请开通微信支付,成功后微信会给你发一封邮件,给你分配一个商户平台账号,在资料里有商户ID **/ public static final String API_KEY; /** 在微信发给你的那封邮件里,给你

  • android端微信支付V3版本地签名统一下单详解

    满满的都是坑,因为服务器偷懒让客服端写统一下单,服务器只给了通知的url.微信的支付demo并没有统一下单的代码. 读此文前先阅读: https://pay.weixin.qq.com/wiki/doc/api/app/app.PHP?chapter=9_1 一步步的来  先根据统一下单的参数介绍工具: 1. 获取到当前的ip: <span style="font-size:14px;">public String getLocalIpAddress() { try { f

  • Android实现微信支付功能

    开发Android APP微信支付功能,需要完成三个步骤:第一步生成预支付订单.第二步生成微信支付参数.第三步调起微信APP支付.除了需要审核通过的APP应用外,还需要获得微信支付接口权限,然后获取对应的商户号.API密钥,这两者缺一不可,并且在APP微信支付中使用 获得商户号.API密钥 在微信开放平台中查看审核通过的APP应用,是否申请支付功能,若已申请,登录微信支付|商户平台:http://pay.weixin.qq.com 查看对应的商户号.API密钥 >申请微信支付接口 >登录商户平

  • Android—基于微信开放平台v3SDK开发(微信支付填坑)

    接触微信支付之前听说过这是一个坑,,,心里已经有了准备...我以为我没准跳坑出不来了,没有想到我填上了,调用成功之后我感觉公司所有的同事都是漂亮的,隔着北京的大雾霾我仿佛看见了太阳~~~好了,装逼结束...进入正题 开发准备: 1.在微信开放平台申请账号 2.成功后创建应用,就是填一些看似很官方很正经的资料了...(说审核7天左右,没有意外的情况下你的app第二天就审核成功了是不是很开心,有了appid,是不是就可以调用微   信支付了????-------想多了,真的) 3.微信支付是需要额外

  • Android集成微信支付功能

    准备工作这里就不说了,包括签约和申请APPID,附上微信开放平台APP开发步骤,不懂的同学可以参考这里: https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5 上面的步骤很详细,这里主要说下调起支付的注意事项.按照上面文档中说的商户服务器生成支付订单,先调用统一下单API生成预付单,获取到prepay_id后将参数再次签名传输给APP发起支付. 相关代码如下: /** * 商户服务器生成支付订单,先调用统一下单API(详见第

  • Android 高仿微信支付数字键盘功能

    现在很多app的支付.输入密码功能,都已经开始使用自定义数字键盘,不仅更加方便.其效果着实精致. 下面带着大家学习下,如何高仿微信的数字键盘,可以拿来直接用在自身的项目中. 先看下效果图: 1. 自定义布局 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

随机推荐