微信支付分(先享后付)对接记录:

微信支付分对接步骤

    1. 填写开通支付分的申请表格 此步骤大概需要审核 1-3 个工作日; (模板-服务信息配置表-【先享后付免确认】-【商户名】.xls) 填写商户信息 和回调地址(支持三套环境)
    1. 拿到审核结果 对技术而言 需要serviceId appid appSecret 和API密钥(签名用) apiclient_cert.xxx 证书文件(退款用)

      升级 V3 证书

    1. 仔细阅读微信官方对接文档
    1. 微信支付分-网约车场景接入流程图(非官方)

      4.1[外链图片转存失败(img-CIx8eVTb-1563787158097)(tomas.test.upcdn.net/java/订单状态流程图1 (1)].jpg)

    4.2 接口说明

    1 用户下单叫车

    用户在商户端下单叫车,一般交互方式为:用户输入出发地/目的地呼叫车辆后,后台查询用户是否可使用服务,若否,则弹出开启微信支付分说明页或按钮,用户点击后,调用开启服务接口(跳转至微信端,进行服务开启),每个用户第一次使用微信支付分方式打车,均需进行一次开启动作。(仅需一次) 微信官方推荐做法个人认为流氓到极致. 我们对此做了改变 引导用户自己在产品中 开启免密支付服务 下单(接到乘客开始服务)时只需要MQ 通知 支付系统 创建免确认支付分订单即可.

    2 查询用户是否可使用服务

    ●接口名称:查询用户是否可使用服务

    ●文档名称:【先享后付-开启支付分服务】

    3.1 请求创建订单

    ●接口名称:创建先享后付订单

    ●文档名称:【先享后付-创建订单】

    3.2 引导用户开启服务

    ●接口名称:小程序跳转接口(开启服务) //文档提供了两种跳转方法,商户自行选择一种即可,此接口支持小程序/app/H5

    ●文档名称:【先享后付-引导用户开通】

    4 行程开始

    商户请求创建订单后,若用户【开启服务成功】+【风险评估通过】则会收到微信支付的异步回调通知,此时可提供网约车服务给用户。

    ●接口名称:用户确认订单通知商户规则

    ●文档名称:【先享后付-用户确认订单通知】

    该步骤可能出现创建订单失败、用户确认订单失败、回调通知异常等情况,导致长时间接收不到微信支付的异步回调通知,此时可进行查询订单状态操作,主动查询确认订单状态。

    ●接口名称:查询先享后付订单

    ●文档名称:【先享后付-查询订单详情】

    5 行程结束

    用户完成打车服务,行程结束

    6 请求完结订单

    商户根据行程订单金额,请求完结订单,发起扣款请求

    ●接口名称:完结先享后付订单

    ●文档名称:【先享后付-完结订单发起扣款】

    7 扣款成功

    微信支付完成扣款,并将扣款结果异步回调通知给商户

    ●接口名称:收款成功通知商户规则

    ●文档名称:【先享后付-扣款成功回调】

    该步骤可能出现扣款失败、回调通知异常等情况,导致长时间接收不到微信支付的异步回调通知,此时可进行查询订单状态操作,避免重复扣款。

    ●接口名称:查询先享后付订单

    ●文档名称:【先享后付-查询订单详情】

    超级坑的技术文档: 签名规则统一以下面网页介绍的为准:

    https://wechatpay-api.gitbook.io/wechatpay-api-v3/qian-ming-zhi-nan-1/qian-ming-sheng-cheng

下面是Java 接入过程:

第一步: 阅读微信支付分给的接口规则 说明: https://wechatpay-api.gitbook.io/wechatpay-api-v3/

第二步: 微信支付API v3要用第三方CA的证书 所以涉及到 API证书升级

  • 新接入商户请参考什么是API证书?如何获取API证书?。

  • 已经接入并使用微信支付颁发证书的商户请参考微信支付API证书升级指引(技术人员)。
    API v3已不支持使用微信支付颁发的证书。
    商户升级API证书时,需要完成三个步骤:

    ①:商户号的超级管理员到商户平台升级证书,获取到权威CA颁发的API证书。 (查看指引)

    ②:超级管理员将权威CA颁发的API证书(共包含三个文件: 证书pkcs12格式、证书pem格式、证书密钥pem格式)转交给技术人员。

    ③:技术人员用新证书文件替换服务器上原微信支付颁发的API证书,无需对现有系统进行代码修改。

    (注意)这里升级API证书不影响原有的 API 密钥 代码不需要做改动直接替换 apiclient_cert.p12文件即可

第三步: 拿到API证书和密钥文件.

第四步: 引入微信支付API v3的Apache HttpClient装饰器: GitHub 地址

​ 注意: 微信支付API v3的Apache HttpClient扩展,实现了请求签名的生成和应答签名的验证。如不想使用次封装客户端 可自己实现 签名和应答解密过程.

​ Maven

​ 加入JitPack仓库

 <repositories><repository><id>jitpack.io</id><url>https://jitpack.io</url></repository></repositories>

加入以下依赖

 <dependency><groupId>com.github.wechatpay-apiv3</groupId><artifactId>wechatpay-apache-httpclient</artifactId><version>0.1.4-SNAPSHOT</version></dependency>

第五步: 请求微信支付分API前准备

   //微信支付商户开通后 微信会提供appidpublic String appId;//微信支付商户开通后 微信会提供appSecretpublic String appSecret;//商户号public String mchId; //32位的api密钥,微信商户平台-账户设置-安全设置-api安全 密钥 用于拉起支付签名public String partnerkey;//openId 是微信用户针对公众号的标识,授权的部分这里不解释public String openId;//微信支付成功后异步通知地址 必须要求80端口并且地址不能带参数public String notifyUrl;//微信支付成功后同步通知地址 必须要求80端口并且地址不能带参数public String returnUrl;//证书apiclient_cert.p12文件位置 可加载public String certPath;//微信支付分 分配的服务 IDpublic String serviceId;//v3接口 CA证书 apiclient_key.pem私钥内容 public String privateKey;//v3接口 CA证书 apiclient_cert.pem证书内容public String certificate;// APIv3密钥 32 位public String AES_KEY = "xxx"; //商户证书序列号 CA证书 可查看微信商户平台-账户设置-安全设置-api安全密钥public String  MC_HSERIAL_NO = "xxxxx"; 

第六步: 请求支付分 API : 签约 创建订单 确认订单

​ DEMO参见: https://github.com/wechatpay-apiv3/wechatpay-apache-httpclient/blob/master/src/test/java/com/wechat/pay/contrib/apache/httpclient/HttpClientBuilderTest.java

几个示例核心代码:

示例: 查询用户签约状态public static final String USER_SERVICE_STATE_URL = "https://api.mch.weixin.qq.com/payscore/user-service-state";PrivateKey merchantPrivateKey = PemUtil.loadPrivateKey(new ByteArrayInputStream(privateKey.getBytes("utf-8")));
//privateKey= //v3接口 CA证书 apiclient_key.pem私钥内容 httpClient = WechatPayHttpClientBuilder.create().withMerchant(mchId, mchSerialNo, merchantPrivateKey).withValidator(response -> true).build();URIBuilder uriBuilder =   new URIBuilder(USER_SERVICE_STATE_URL);uriBuilder.setParameter("service_id", yourServiceIdxxx);uriBuilder.setParameter("appid", yourAppIdxxx);uriBuilder.setParameter("openid", userOpenIdxxx);CloseableHttpResponse response=null;try {HttpGet httpGet = new HttpGet(uriBuilder.build());httpGet.addHeader("Accept", "application/json");// NOTE: 建议指定charset=utf-8。低于4.4.6版本的HttpCore,不能正确的设置字符集,可能导致签名错误response = getHttpDefaultClient().execute(httpGet);if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){String result = EntityUtils.toString(response.getEntity());// 返回json格式:return JSONObject.parseObject(result);}else {String result = EntityUtils.toString(response.getEntity());// 返回json格式:log.info("微信支付V3 url={} result={} responseEntity={}",uriBuilder.build(), result,JSON.toJSONString(response.getEntity()));}} catch (Exception e) {log.error("微信支付V3 请求url={}异常 ",uriBuilder.build());}finally {if(null!=response){response.close();}}示例: 创建支付分订单 public static final String PAYSCORE_PAYAFTER_ORDERS_URL = "https://api.mch.weixin.qq.com/v3/payscore/payafter-orders";//【先享后付-创建订单】参数 转化成javaBean/或者 JSONOjbect 设置参数 //注意我这里need_user_confirm 参数 如果传 false 表不需要用户确认 PayAfterOrdersModel  payAfterOrdersModel=PayAfterOrdersModel.builder().appid(appId).need_user_confirm(Boolean.FALSE).openid(recordModel.getOpenId()).risk_amount(PAY_SIGN_RISK_AMOUNT).out_order_no(model.getObjId()).service_start_time(DateTimeUtils.dateFormat(model.getServiceStartTime(),"yyyyMMddHHmmss")).service_start_location(WxPayUtil.subString(model.getServiceStartLocation(),20)).service_introduction(PAY_SIGN_FEE_DESC).service_id(config.getServiceId()).build();Fees fee=new Fees();fee.setFee_name("xx费");fee.setFee_amount(amount); //支付金额fee.setFee_desc("xxx");List<Fees> fees=new ArrayList<>();fees.add(fee);
payAfterOrdersModel.setFees(fees);//如果有优惠请设置优惠信息  此处不做设置//构造 ClientPrivateKey merchantPrivateKey = PemUtil.loadPrivateKey(new ByteArrayInputStream(privateKey.getBytes("utf-8")));
//privateKey= //v3接口 CA证书 apiclient_key.pem私钥内容 httpClient = WechatPayHttpClientBuilder.create().withMerchant(mchId, mchSerialNo, merchantPrivateKey).withValidator(response -> true).build();//请求支付分HttpPost httpPost = new HttpPost(PAYSCORE_PAYAFTER_ORDERS_URL);StringEntity reqEntity = new StringEntity(JSONObject.toJSONString(payAfterOrdersModel), ContentType.create("application/json", "utf-8"));httpPost.setEntity(reqEntity);httpPost.addHeader("Accept", "application/json");httpPost.addHeader("Content-Type", "application/json");CloseableHttpResponse response = httpClient.execute(httpPost);try {if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){String result = EntityUtils.toString(response.getEntity());// 返回json格式:log.info("微信支付V3 url={} result={} ",url,result);return JSONObject.parseObject(result);}else {String result = EntityUtils.toString(response.getEntity());// 返回json格式:log.info("微信支付V3 url={} result={} response.getEntity()={}",url,result,JSON.toJSONString(response.getEntity()));}} catch (Exception e) {log.error("微信支付V3 请求url={} 参数={} 异常 e={}",url, JSON.toJSONString(json),e.getMessage());}finally {response.close();}后续 完结订单   (注意请求完结订单的时有个finish_ticket 只有用户确认了订单才能拿到) 如果是创建的免确认订单 需要创建完订单后 查询订单详情 返回值中有 finish_ticket字段 

第七步: 接收回调消息:

… 去博客园看完整文章内容吧 这里只写了部分

原文链接地址**

微信支付分(先享后付)对接记录:相关推荐

  1. 微信支付首创“先享后付”保险模式 司乘没交钱就可享受高速保险服务

    侯维科技 7月11日消息,微信今日宣布,微信支付正式提供"开微信代扣,享高速保障"能力,推动行业首创"先享后付"的保险模式.这意味着,车辆从高速收费站" ...

  2. 微信支付分,APIv3版本接口对接过程(附代码)

    刚对接完微信支付分,对接过程还是有点小坑,微信官方的接口文档写的比较粗略,代码示例比较少,网上的相关技术博客少之又少,前期还是有点小困难的,所以决定把对接过程梳理一下,希望能帮到需要的人. APIv3 ...

  3. 微信支付分使用用户数超2.4亿 每日使用笔数达千万级

    1月19日消息,在2021微信公开课PRO上,微信支付团队公布了微信支付分的最新数据:微信支付分使用用户数超2.4亿,为用户节省超过2000亿元押金,超过1000万名用户使用过快递的先寄后付服务. 据 ...

  4. 微信支付先享后付java实现(持续更新中)

    由于网上资料少,而且微信的文档我知道的就有4-5个版本,各个不一样,所以做这个的时候还是挺坑的,还好已经实现了,特此记录一下,让后来人,有个参考 一.先注册微信商户平台,那一堆乱七八糟的,就不说了,自 ...

  5. java快速对接微信支付分(一)

    1.微信支付分产品介绍 维信支付分是对个人的身份特质.支付行为.使用历史等情况的综合计算分值,旨在为用户提供更简单便捷的生活方式. (1)用户可在具体应用场景中,开通威信支付分,此为最常见的开通方法. ...

  6. 微信支付分正式上线:马化腾在朋友圈四处挑战,10分钟后被打败

    Python实战社群 Java实战社群 长按识别下方二维码,按需求添加 扫码关注添加客服 进Python社群▲ 扫码关注添加客服 进Java社群▲ 作者丨周小白 来源丨TechWeb(TechWeb) ...

  7. 微信支付分计算机,微信支付分付怎么开通?微信分付可用额度从这里看

    在讲微信支付分付怎么开通之前,我们先来了解下什么是微信分付,其实温馨的这个分付产品其实就相当于支付宝的花呗,这么说大家应该都明白了吧.微信的分付也是一种支付方式,先付款后还款的方式,这样大家买东西的时 ...

  8. Payment Spring Boot 1.0.2.RELEASE 发布,接入微信支付分、先享卡功能

    Payment Spring Boot 是微信支付V3的Java实现,仅仅依赖Spring内置的一些类库.配置简单方便,可以让开发者快速为Spring Boot应用接入微信支付. 演示例子:https ...

  9. java快速对接微信支付分(二)

    4.实际开发的细步骤 C--请求订单接口返回结果页面 1.当前端进行调用微信订单接口的时候, 该接口微信那边会进行自己进行返回两个页面给用户,一个是符合免押的条件直接给用户确认订单, 二是为符合微信支 ...

最新文章

  1. 【Netty】使用 Netty 开发 HTTP 服务器 ( HTTP 请求过滤 )
  2. C++(五)——运算符重载
  3. P3577-[POI2014]TUR-Tourism【状压dp】
  4. autovalue_AutoValue:生成的不可变值类
  5. c 语言指针教学视频,[C语言] 猎豹网校 C和指针视频教程
  6. mac下ssh报错:ssh_exchange_identification: read: Connection reset by peer
  7. stata面板数据:xtserial下载问题解决
  8. kali如何对网站进行ddos攻击
  9. 实时数据库简介和比较---PI
  10. PCL学习笔记3-KdTree
  11. 由Monkey测试引发的跨多个进程的Android系统死锁问题分析
  12. National.Geographic.100.Years.国家地理百年纪念典藏
  13. charles map local之后如何取消映射?
  14. 2021-IP地址详解02
  15. 【无标题】unity人脸融合API Face++
  16. 如何设计杀手级的物联网产品或服务?
  17. HDU2087,1686 KMP
  18. raw格式照片一键改变风格
  19. 挑选出两个日期中间的指定礼拜几的时间
  20. 一加oneplus8pro怎么样?

热门文章

  1. 如何保护iPhone App不被破解办法
  2. 基于SSM的学籍证明打印系统设计与实现。
  3. stm32+neo6m GPS模块定位系统
  4. getClass和.class作用
  5. word文件打开就是只读模式,怎么办
  6. 36条双色模具设计及双色注塑成型的经验分享
  7. GMW 3172-2018 General Specification for ElectricalElectronic
  8. mysql基本语句(建立,添加,修改,删除)
  9. 【数据结构】实验五:树和二叉树
  10. java 引用 jar包_java命令行引用jar包的方法