常用链接

官方网站

微信支付开发文档
小程序接入微信支付指引
腾讯免费证书安装指引

开源工具

Wpay 轻量的微信支付组件
weixin-java-tools 微信JAVA SDK
weixin-sdk 微信JAVA SDK

1.小程序接入微信支付指引

1.1 术语

支付模式

  • 刷卡支付:用户展示二维码,商户扫描后完成支付,用于线下收银场景;
  • 扫码支付:生成二维码,用户扫一扫完成支付,用于网页字符或线下收银;
  • 公众号支付:在公众号中打开商户的H5页面,调用JS-API完成支付;
  • APP支付:在移动端中集成支付SDK完成支付;
  • 小程序支付:在小程序平台内实现支付;

名词解释

  • 商户证书:微信提供的二进制文件,识别商户真实身份的凭据;
  • 签名:商户后台和微信支付后台根据相同的秘钥和算法生成的结果,用于校验双方的合法性;
  • Openid:用户在小程序内的标识符;

1.2 支付账户

  • appid:小程序的唯一标识;
  • mch_id:商户ID,商户申请微信支付后分配的商户收款账号;
  • key:交易过程中生成的秘钥,不在网络中传播;
  • secrtet:appid对应的接口密码,为调用接口的凭据;

1.3 接口规则:

1.3.1 协议规则

  • HTTPS传输;
  • POST方式提交;
  • XML作为数据格式;
  • UTF-8字符编码;
  • MD5签名算法,满足签名规范;
  • 退款、撤销时需要商户证书;
  • 先判断协议反馈、再判断业务返回、最后判断交易返回;

1.3.2 参数规定

  • body字段:商家名称-销售商品类目;
  • 交易金额:单位为分;
  • 交易类型:JSAPI;
  • 货币类型:CNY;
  • 时间:东八区;
  • 时间戳:10位数字,19700101至今的秒数;
  • 商户订单号:商户生成,唯一,重新发起字符需要使用原订单号;
  • 银行类型:参考API文档;

1.3.3 签名算法

随机数

  • nonce_str字段为随机字符串;

签名算法

  • 参数名字典排序;
  • 拼接临时字符串k1=v1&k2=v2.....
  • 拼接API秘钥;
  • 计算MD5;

1.4 小程序支付

1.4.1 开发步骤

  • 统一下单:获取openid,调用相同的API;
  • 数据签名:appId,nonceStr,package,signType,timeStamp;
  • 通讯协议:HTTPS;
  • 支付目录:无;
  • 授权域名:无;

1.4.2 业务流程

业务

  • 用户点击支付;
  • 小程序调用服务端下单接口;
  • 服务端获取用户的openid
  • 服务端生成商户订单数据;
  • 服务端构造报文,调用统一支付接口完成下单(需要签名);
  • 微信服务器返回预付单信息prepay_id
  • 服务端将组合数据再次签名;
  • 服务端返回字符参数(5个参数和sign);
  • 用户前端确认支付;
  • 小程序端发起调用支付接口;
  • 微信服务端返回支付结果;
  • 小程序端展现支付结果;
  • 微信服务端向服务端推送支付结果;
  • 服务端更新订单状态为已支付;

1.4.3 小程序调起微信支付API

需要签名的字段

  • 小程序ID appId
  • 时间戳 timeStamp
  • 随机字符串 nonceStr不超过32位;
  • 数据包 package;即为统一下单返回的prepay_id
  • 签名方式 signType;固定为MD5

调用接口

1
2
3
4
5
6
7
8
9
10
11
wx.requestPayment(
{
'timeStamp': '',
'nonceStr': '',
'package': '',
'signType': 'MD5',
'paySign': '',
'success':function(res){},
'fail':function(res){},
'complete':function(res){}
})

1.5 API列表

  • 统一下单:商户在小程序中先调用该接口在微信支付服务后台生成预支付交易单,返回正确的预支付交易后调起支付;
  • 查询订单:该接口提供所有微信支付订单的查询,商户可以通过查询订单接口主动查询订单状态,完成下一步的业务逻辑;
  • 关闭订单:商户订单支付失败需要生成新单号重新发起支付,要对原订单号调用关单,避免重复支付;系统下单后,用户支付超时,系统退出不再受理,避免用户继续,请调用关单接口;
  • 申请退款:当交易发生之后一段时间内,由于买家或者卖家的原因需要退款时,卖家可以通过退款接口将支付款退还给买家,微信支付将在收到退款请求并且验证成功之后,按照退款规则将支付款按原路退到买家帐号上;
  • 查询退款:提交退款申请后,通过调用该接口查询退款状态。退款有一定延时,用零钱支付的退款20分钟内到账,银行卡支付的退款3个工作日后重新查询退款状态;
  • 下载对账单:商户可以通过该接口下载历史交易清单。比如掉单、系统错误等导致商户侧和微信侧数据不一致,通过对账单核对后可校正支付状态;
  • 支付结果通用通知:支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。