微信代扣 Android 开发流程

最近几天采坑了微信代扣,开发流程很简单,但是官方文档实在缺少一个具体的指引,导致走了很多弯路,因此本文分享一下自己的经验。
微信代扣开发者文档: https://pay.weixin.qq.com/wiki/doc/api/pap.php?chapter=18_1

微信代付文档截图

上图是文档的网页截图,其中红框里的 SDK 需要配置一下,APP跳转签约页面方法指引 是外部唤起微信的方法,(话说这个入口我找了好久才发现,一把辛酸泪……)
文档很长,对于各个端做什么也没有明确描述,所以我站在 Android 端的角度,讲一下开发流程。总共分以下三步:

1、调用服务端接口进行签约
服务端接口的返回类型是自定义的 Contract 类,其中 contractIdcontractUrl 是 Android 端能用到的。(接口格式以你们服务端给的为准,此处仅供参考)

  //签约
  @POST("/xxx/contracts")
  Observable<Response<Contract>> getContract();

public class Contract {
    @JsonProperty("contract_id")
    public String contractId; // 微信给的签约合同号

    @JsonProperty("contract_url")
    public String contractUrl;// 可以调起微信的url

    @JsonProperty("product_id")
    public String productId; // IOS 会用到的 id,Android 端可以直接忽略
}

2、利用服务端返回的 contractUrl 调起微信签约付款页

private void toWeChatScan(String url) {
      try {
          WeChatPayUtil.pay(getActivity(), url);
      } catch (Exception e) {
          //若无法正常跳转,在此进行错误处理
          Toast.makeText(getContext(), "跳转到微信失败",Toast.LENGTH_SHORT).show();
      }
}
public class WeChatPayUtil {
    private static IWXAPI sWXAPI;
     /**
     * 微信代扣
     * @param pActivity
     * @param url
     * @return
     * @throws Exception
     */
    public static boolean pay(Activity pActivity, String url) throws Exception {
        if (sWXAPI == null) {
            sWXAPI = WXAPIFactory.createWXAPI(pActivity, WeChatHelper.WECHAT_APP_ID);
        }
        if (微信未安装) {
            ToastUtils.showLongToast(pActivity, R.string.toast_text_weixin_not_installed);
            return false;
        }
        toWechatContractPay(url);
        return true;
    }
    private static void toWechatContractPay(String url) {
        OpenWebview.Req req = new OpenWebview.Req();
        req.url = url;
        sWXAPI.sendReq(req);
    }
}

3、调用服务端接口轮询检查支付状态
微信代付的话,在微信中支付完成后,并不会同步返回结果给我们的 app,只会把支付结果通知我们的服务器,所以需要在我们的 app 中对服务器进行轮询来检查支付结果。
检查也不需要很多次,我们项目里是轮询 5 次,1 秒一次,已经足够了。
(接口格式以你们服务端给的为准,此处仅供参考)

    /**
     * 查看自动续费签约状态
     *
     * @param packageId
     * @param contractId
     * @return
     */
    @GET("/xxx/contracts/{contract_id}")
    Observable<Response<OrderStatus>> getOrderStatus(@Path("contract_id") String contractId);

其中的 contract_id 是在步骤1中返回的,这里需要用这个合同号来检查状态。

public class OrderStatus {
    @JsonProperty("status")
    public String status;//granted, ungranted, pending, unsubscribed

    @JsonProperty("singed_at")
    public long singedAt;//签约成功的时间(这个只有在 granted 状态时才有效)

    @JsonProperty("contract_type")
    public String contractType;//wechat, iap

    @JsonProperty("withhold")
    public OrderStatusWithhold withhold;
}

public class OrderStatusWithhold {
    @JsonProperty("status")
    public String status;//<"created", "pending", "succeeded", "failed">

    @JsonProperty("error_message")
    public String errorMessage;

}

需要注意上面两个 status 代表不同的意义, orderStatus.status 是签约状态,而orderStatusWithhold.status 是扣款状态,有可能签约成功,但是扣款时因为余额不足等原因而失败。

附一个讲代扣整体过程的文章,要开发的话值得一看:
http://jverson.com/2015/12/20/wechat/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,382评论 25 707
  • 因为筹备三亚的摄影基地需要大量资金,这两天让北京的房产公司出售公寓和商铺,由于北京的限购政策要求只有公司才能购买商...
    一世惊鸿阅读 72评论 0 0
  • 父亲把一件价值10块钱的衣服,交给孩子“你要把衣服卖出去,卖到20元”孩子一脸诧异,但看到贫穷的家境,他想为家庭做...
    永远的mark阅读 395评论 0 2
  • 相信大家对大年初二的习俗都不陌生,在这一天,大半个中国已经出嫁的女儿都要回娘家,老家也不例外。 初二这一天,已经出...
    8c8392d58a4a阅读 340评论 1 0