干货:这里有一份小程序接入微信支付避雷指南
接入背景
基本上,基于微信生态下的产品,想要接通支付功能,那么无论如何也避免不了的一个环节就是接入微信支付产品。
下文,是笔者基于过往开发经验,总结的一个接入微信支付的避雷指南!
坑一:自动结算
1、什么情况
这里先解释一下什么是自动结算。当结算周期到了以后,微信支付会将微信支付商户号里面的未结算金额自动划走至商户号绑定的银行账户上面,并且收取约定的费率。简单来说就是:自动帮你提现了,并且还收手续费。
会产生什么样的问题呢?
当我需要退款给用户的时候,发现账户上的钱全部被结算的银行卡上了,没有钱退款给用户!!
那么如何关闭自动结算这个差评功能呢?
打开微信支付商户后台,点击产品中心看下有没有关闭自动结算的功能。
然而并不是所有商家号都拥有这个功能的。
没有关闭自动提现功能的产品中心
有关闭自动提现功能的产品中心
如何拥有关闭自动提现的功能?我找了很久,终于发现了其中的奥秘,为什么一个商家号里面有这个功能,一个没有。
关键在:结算周期
商家号结算周期信息
只要你属于结算周期为T+n的,都是没有关闭自动提现功能的。而且在你注册的时候,选定了经营类目,那么你的结算周期就将无法进行修改!!因为关于结算的修改内容,微信只开放了修改结算银行账户。
修改账户信息
2、怎么避免踩坑
先看几个截图:
经营类目结算周期为:实时结算到基本户
经营类目结算周期为:T+n
也就是说,你选择的经营类目结算周期为实时结算到基本户才有关闭自动结算的功能,而结算周期为T+n的是没有这个功能的。
坑二:无法更换小程序绑定的微信支付商户号
1、什么情况
小程序后台里面关于微信支付的绑定方式有两种:1、利用现有小程序作为申请入口,申请一个新的微信支付;2、绑定已有的微信支付商户号。
无论选择哪种方式,都是一绑定终生!也就是没有入口进行更换绑定的商户号
小程序后台-微信支付页面
2、如何避免踩坑
(1)一定要慎重、慎重、慎重!想清楚是新注册还是绑定旧账户。推荐不同的业务最好分开结算,这样便于财务进行对账。
(2)如果条件允许一定要绑定能关闭自动结算的微信支付商户号,能省去许多麻烦。
坑三:关于退款来源
1、什么情况
微信支付API文档截图
微信支付api文档里面,退款申请接口列表,有一个叫退款申请的api。我们可以利用调取这个接口,从而在自己的后台开发出退款功能,而不用每对一个用户发起退款,都要登录微信支付的后台进行操作。而退款资金来源字段有两种资金来源:一种是未结算资金退款,一种是可用余额退款。
未结算资金:当你的账号是t+n的时候,只要结算周期没到,入账的所有资金都会算作未结算资金。
可用余额退款:可用余额一般是指你通过“充值”进入商户号里面的钱。
在开发的过程中,我们曾经遇到一个场景:明明今天有订单金额进账,但是怎么也不能对用户进行退款。原来我们是设置了退款资金来源为可用余额退款。从而系统退款的时候自动绕过了未结算资金退款。
2、如何避免踩坑
设计业务退款流程的时候,应该做一个逻辑判断:先判断未结算资金是否满足退款金额,如果可以,则用未结算金额退款。
不满足则再用可用余额退款,如果不满足则退款失败。
退款功能流程设计
为什么要这么设计?
可以先利用未结算资金退款的话,就能少收取一些结算时候的手续费,减少金额损耗。
第二,可用余额是充值进去,用一点少一点,微信支付的充值流程异常复杂,少用可用余额可以减少不必要的公司内部财务流程。
小结
微信支付作为小程序生态帮助商家实现商业化的一个必不可少的环节,优化用户体验还是十分必要的,希望能尽快迭代改进。
- 用Js控制TextBox不能复制粘贴
- 漫画:什么是单例模式?(整合版)
- 保护连接字符串
- IntelliJ IDEA 复杂的重构技巧(二)
- Spring Boot中使用Flyway来管理数据库版本
- 缓存穿透、缓存并发、热点缓存之最佳招式
- 【译】Spring 官方教程:使用 Restdocs 创建 API 文档
- c#中设置快捷键
- 程序员你为什么这么累【续】:编码习惯之工具类规范
- IntelliJ IDEA 复杂的重构技巧
- 打造属于自己的支持版本迭代的Asp.Net Web Api Route
- 分布式消息队列 RocketMQ 源码分析 —— Message 拉取与消费(上)
- 分布式消息队列 RocketMQ 源码分析 —— Message 拉取与消费(下)
- Spring Boot中使用RabbitMQ
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android 实现将Bitmap 保存到本地
- Android Gradle依赖管理、去除重复依赖、忽略的方式
- Andriod Studio实现保存QQ密码功能(案例代码详解)
- Android Studio编写微信页面提交功能
- android 实现按钮浮动在键盘上方的实例代码
- 创建Android守护进程实例(底层服务)
- android studio xml文件实现添加注释
- 解决Android studio xml界面无法预览问题
- Android Studio通过Artifactory搭建本地仓库优化编译速度的方法
- Android实现向本地写入一个XML文件和解析XML文件
- Android自定义View实现带4圆角或者2圆角的效果
- Android 在 res/layout 文件夹 下创建一个 子文件夹实例
- Android开发实现TextView超链接5种方式源码实例
- Android根据包名停止其他应用程序的方法
- Android APP存活检测方式