美文网首页android 工具包android
微信代扣 Android 开发流程

微信代扣 Android 开发流程

作者: GloryObject | 来源:发表于2018-01-19 11:31 被阅读1377次

    最近几天采坑了微信代扣,开发流程很简单,但是官方文档实在缺少一个具体的指引,导致走了很多弯路,因此本文分享一下自己的经验。
    微信代扣开发者文档: 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/

    相关文章

      网友评论

      • 天天小志:你好,如果不通过服务器去调用微信签约的接口,我们APP上自己调用此接口(回调写服务端接口),那么是否就是OpenWebview.Req req = new OpenWebview.Req();
        req.url = url.toString();中的req.url,比如url="https://api.mch.weixin.qq.com/papay/entrustweb?appid=wx888888&;mch_id=153213111&plan_id=&contract_code=&request_seri..."
        天天小志:@GloryObject 你好,我在把Url拼接好通过调用sendReq发送到微信,可是不能正常调用,你这边可以给看下后台处理了什么吗?他给你返回的url是什么呢?
        天天小志:@GloryObject 多谢,回头我试下哈
        GloryObject:看着挺像
      • 广商校友会:开发功能为:扫描二维码以后/注册手机号码/转入学生姓名/年级、班级/支付开通自动续费包月功能/成功后发送信息到达注册手机号码(登陆APP帐号/登陆密码/APP下载链接)
      • 广商校友会:可以留下你联系方式吗?我公司要开发自动续费平台!
      • c2c3d8d9b7ee:OpenWebview.Req req = new OpenWebview.Req();
        req.url = url;
        sWXAPI.sendReq(req);
        请问调起微信页面之后结果会回调到WXEntryActivity里吗?现在打开一个url(随便写的)会提示无法访问也没有任何回调(暂时没有正确的URL可以调试)
        GloryObject:@当我变成大胖子 不用客气~
        c2c3d8d9b7ee:@GloryObject 这样子呐,非常感谢你的回答!!
        GloryObject:不会回调到 app 里的,微信那边只会把支付结果给你们的后端,需要你调接口轮询你们的后端
      • ab7eb68e3029:现在微信代扣关闭了吧,在微信支付官网都找到微信代扣的开发文档了...还是说现在需要什么特殊途径去申请?
        ab7eb68e3029:@GloryObject 这个文档我知道,在百度有收入,但是微信支付官网貌似已经没有入口了,所以才怀疑是不是已经关闭了
        GloryObject:@Jasoncm 我看了下还是能找到的 ,传送门 https://link.jianshu.com/?t=https%3A%2F%2Fpay.weixin.qq.com%2Fwiki%2Fdoc%2Fapi%2Fpap.php%3Fchapter%3D18_1
      • jdsjlzx:能不能留个联系方式啊,请教个问题
      • lin0426:你好 我们服务器下发的contract_url能在微信上 正确打开,但是用app调用sdk打开就提示 当前页面无法访问。 这是什么问题呢
        lin0426:@天天小志 联系下微信工作人员,应该是相关调用权限没有开通
        天天小志:你好,我也是直接拼接url调用微信sdk,提示当前页面无法访问,请问你是怎么解决的
        GloryObject:app 调用 sdk 打开的调用方法没问题吧
      • GloryObject:欢迎提问交流~~

      本文标题:微信代扣 Android 开发流程

      本文链接:https://www.haomeiwen.com/subject/prwwoxtx.html