欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2024-02-28 09:29:40
写在前面 一家移动互联网公司,说到底,要盈利总是需要付费用户的,自己开发支付系统显然是不明智的,国内已经有多家成熟的移动支付提供商,腾讯就是其中之一。梳理了下微信支付的接...

写在前面

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

1.申请开发者资质

地址:

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

备注:因为从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.代码集成微信支付 

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

微信支付流程图白话版:

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

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

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

备注2:详细字段请参考: 

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下载:,吐槽语:官方demo下载藏的有点深。。。开放平台居然没有提供下载,放在微信支付商户平台。