微信支付实战总结

微信支付实战总结

  • 微信支付介绍 , 微信支持多种支付

    • APP支付:商户APP内集成微信支付SDK ,商户APP调用微信提供的SDK调用微信支付模块,商户APP会跳转到微信中完成支付,支付完后跳回到商户APP内,最后展示支付结果。

      • 开通流程:在入驻时选择APP场景的商户系统默认开通此功能,其他商户如有需要,可以在入驻后前往商户平台-产品中心-APP支付-申请开通;
      • 需要材料:开放平台已认证的移动引用APPID;APP页面截图;APP在主流应用市场的下载地址。
    • Native 支付:是指商户系统按微信支付协议生成支付二维码,用户再用微信“扫一扫”完成支付的模式。该模式适用于PC网站、实体店单品或订单、媒体广告支付等场景;可以实现朋友代付功能

      • 开通流程:在入驻时选择PC网站场景的商户系统默认开通此功能,其他商户如有需要,可以在入驻后前往商户平台-产品中心-Native支付-申请开通。
    • JSAPI支付:是指商户通过调用微信支付提供的JSAPI接口,在微信内打开商家H5界面,在微信内完成支付

      • 线下场所:调用接口生成二维码,用户扫描二维码后在微信浏览器中打开页面后完成支付
      • 公众号场景:用户在微信公众账号内进入商家公众号,打开某个主页面,完成支付
      • PC网站场景:在网站中展示二维码,用户扫描二维码后在微信浏览器中打开页面后完成支付
      • 开通流程:在入驻时选择线下场所,公众号场景,PC网站场景的商户系统默认开通此功能,其他商户如有需要,可以在入驻后前往商户平台-产品中心-JSAPI支付-申请开通。
    • H5支付 : 是指商户在微信客户端外的移动端网页展示商品或服务,用户在前述页面确认使用微信支付时,商户发起本服务呼起微信客户端进行支付。主要用于触屏版的手机浏览器请求微信支付的场景。可以方便的从外部浏览器唤起微信支付

      • 类似于支付宝的 快捷手机wap支付
      • 开通流程:登录商户平台–>产品中心–>我的产品–>支付产品–>H5支付
      • 所需材料:H5支付域名;售卖产品/使用场景的描述;所售卖产品对应的官方网站域名或详情页网址。
    • 小程序支付:小程序支付是指商户通过调用微信支付小程序支付接口,在微信小程序平台内实现支付功能;用户打开商家助手小程序下单,输入支付密码并完成支付后,返回商家小程序。

      • 开通流程:在入驻时选择小程序场景的商户系统默认开通此功能,其他商户如有需要,可以在入驻后前往商户平台-产品中心-小程序支付-申请开通。
    • 付款码支付: 是指用户展示微信钱包内的“付款码”给商户系统扫描后直接完成支付,适用于线下场所面对面收银的场景

      • 相当于支付宝的 当面付收单
      • 开通流程:在入驻时选择线下场所的商户系统默认开通此功能,其他商户如有需要,可以在入驻后前往商户平台-产品中心-付款码支付-申请开通。
  • 准备工作

    • 商户在微信开放平台申请开发应用后,微信开放平台会生成APP的唯一标识APPID 和 AppSecret
    • 登录微信开放平台,绑定商户应用包名和应用签名
    • 到微信商户后台,申请开通微信支付功能
      • 登录商户平台: https://pay.weixin.qq.com/
      • 绑定商户安全锁(APP版)方法 , doc
      • 操作密码 : 6位数字 , 忘记密码怎么办
      • 申请API证书 , doc
  • APP支付流程,参见 官方时序图

    • 步骤1:用户在商户APP中选择商品,提交订单,选择微信支付。
    • 步骤2:商户后台收到用户支付单,调用微信支付统一下单接口。参见【统一下单API】。
    • 步骤3:统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appid,partnerid,prepayid,noncestr,timestamp,package。注意:package的值格式为Sign=WXPay
    • 步骤4:商户APP调起微信支付。api参见本章节【app端开发步骤说明
    • 步骤5:商户后台接收支付通知。api参见【支付结果通知API
    • 步骤6:商户后台查询支付结果。,api参见【查询订单API
  • NATIVE 扫码支付,包括下面两种模式

    • 【模式一】:商户后台系统根据微信支付规则链接生成二维码,链接中带固定参数productid(可定义为产品标识或订单号)。用户扫码后,微信支付系统将productid和用户唯一标识(openid)回调商户后台系统(需要设置支付回调URL),商户后台系统根据productid生成支付交易,最后微信支付系统发起用户支付流程
      • 具体可参见官方的时序图
      • 商户支付回调URL设置指引:进入商户平台–>产品中心–>开发配置,进行配置和修改
    • 【模式二】:商户后台系统调用微信支付【统一下单API】生成预付交易,将接口返回的链接生成二维码,用户扫码后输入密码完成支付交易。注意:该模式的预付单有效期为2小时,过期后无法支付。
      • 具体可参见官方的时序图
      • 注意:调用统一下单接口时,只需要将入参中的 trade_type 支付类型从APP改成 NATIVE 即可,那么返回的参数中就会包括二维码的URL(code_url
  • 沙箱测试 , 仿真系统的简化原理图,参见官网

    • 使用沙箱环境准备工作

      • 在正式API的URL中,增加一层sandboxnew路径,如:统一下单接口( https://api.mch.weixin.qq.com/sandboxnew/pay/unifiedorder )
      • 在调用沙箱环境的API 之前,要用 sandbox_signkey 代替商户key重新签名入参。sandbox_signkey 是通过调用 getsignkey 接口获得的 ( https://api.mch.weixin.qq.com/sandboxnew/pay/getsignkey ),此接口的入参仍然需要用 商户key 进行签名才能访问。
    • 特别注意,沙箱环境的支付金额是固定的,不能随便写,也不只有 1.01 和 1.0.2 ,具体参见微信提供的测试用例

      • 支付金额 301 表示:用户支付成功
      • 支付金额 302 表示:用户支付成功,其中包含1充值代金券,2免充值代金券,现金支付209
      • 支付金额 330 表示:用户支付成功,商户未收到微信支付结果通知,商户需调用交易查询接口核对
      • 支付金额 331 表示:用户支付失败,商户未收到微信支付结果通知,商户需调用交易查询接口核对
      • 支付金额 332 表示:用户支付成功,微信支付重复通知商户,商户提供的通知接口要具有幂等性
      • 支付金额 333 表示:用户支付成功,微信支付通知签名非法,商户应忽略此信息并作出报警
      • 支付金额 334 表示:用户支付成功,微信支付通知金额不一致,商户应忽略此信息并作出报警
      • 支付金额 379 表示:用户支付成功,商户未收到微信支付结果通知,T+1日下载对账单,查看该笔交易,支付成功。
    • 沙箱测试步骤

      • 正式API地址 增加/sandboxnew/ 路径
      • 按正式流程做 sign
      • 用正式sign,额外调用 https://api.mch.weixin.qq.com/sandboxnew/pay/getsignkey 获得sandbox_signkey
      • 用sandbox_signkey 替换用户自己的商户 key,再做sign签名
      • 用第二次生成的 sign 来调用后续支付接口
    • 例如:统一下单接口

      // 沙盒测试
      private String wxGetSignKey = "https://api.mch.weixin.qq.com/sandboxnew/pay/getsignkey";
      private String wxUnifiedOrder= "https://api.mch.weixin.qq.com/sandboxnew/pay/unifiedorder";
      
      // params 请参见上一节的入参准备 部分
      Map<String, String> params = new HashMap<>();
      // ... 
      // 按正式环境生成 sign , 使用生产环境的商户key
      String sign = Signature.getSign(params, "微信支付生产环境的商户key");
      params.put("sign", sign);
      String xmlString = XmlUtils.toXml(params);
      String result = HttpUtils.httpsRequest(wxGetSignKey, "POST", xmlString);
      // <xml><return_code>SUCCESS</return_code><return_msg>ok</return_msg>  <sandbox_signkey>1f4aa7e89b2cefe4cbac896cc73c8383</sandbox_signkey></xml>
      Map<String, String> signKeyMap = XmlUtils.parseXmlToMap(result);
      // 获得沙箱环境的商户key,使用sandbox_signkey 生成sign
      String sandbox_key = signKeyMap.get("sandbox_signkey");
      
      // 使用 sandbox_key 重新对 入参进行签名,注意要先 remove掉sign
      params.remove("sign");
      sign = Signature.getSign(params, sandbox_key);
      // 使用新的 签名
      params.put("sign", sign);
      xmlString = XmlUtils.toXml(params);
      result = HttpUtils.httpsRequest(wxUnifiedOrder, "POST", xmlString);
      Map<String, String> unifiedOderMap = XmlUtils.parseXmlToMap(result);
      // 获得 prepay_id ,返回给手机端
      unifiedOderMap.get("prepay_id");
      
  • APP支付 - 后端接口

    • 统一下单 接口:https://api.mch.weixin.qq.com/pay/unifiedorder

      • 商户系统先调用该接口在微信支付服务后台生成预支付交易单,返回正确的预支付交易会话标识后再在APP里面调起支付

      • 入参,注意使用金额使用301, 不要使用302,否则退款申请不成功

         <xml>
          <appid>***</appid>
          <mch_id>***</mch_id>
          <nonce_str>t9gk4aov6wa0433j8v34upn3bcwgcd1v</nonce_str>
          <sign>73B4B1EF307ACAF2D1D8EE67F06D2A64</sign>
          <!--商品描述交易 字段,格式根据自定义,如:APP名字-实际商品名称 -->
          <body>想见你APP - 应援棒充值</body>
          <attach>{"payType":2,"outTradeNo":"***"}</attach>
          <!--商户系统内部订单号,要求32个字符内,只能是数字、大小写字母-->
          <out_trade_no>tradepay15859085002012152451</out_trade_no>
          <!--订单总金额,单位为分-->
          <total_fee>301</total_fee>
          <!--接收微信支付异步通知回调地址-->
          <notify_url>http://112.*.*.*:*/wxpay/wxpay_notify</notify_url>
          <!--支付类型: APP , NATIVE(二维码)-->
          <trade_type>APP</trade_type>
        </xml>
        
      • 出参

         <xml>
           <!--此字段是通信标识,非交易标识,交易是否成功需要查看result_code来判断-->
           <return_code>SUCCESS</return_code>
           <return_msg>OK</return_msg>
           <appid>***</appid>
           <mch_id>***</mch_id>
           <nonce_str>IITRi8Iabbblz1Jc</nonce_str>
           <sign>7921E432F65EB8ED0CE9755F0E86D72F</sign>
           <result_code>SUCCESS</result_code>
           <!--预支付交易会话标识 , 用于后续接口调用中使用,该值有效期为2小时-->
           <prepay_id>wx201411101639507cbf6ffd8b0779950874</prepay_id>
           <trade_type>APP</trade_type>
        </xml>
        
      • Java 代码

        // 1. 准备入参 &#
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值