版本:2016.10.11
文章目录
微信支付模式
刷卡支付是用户展示微信钱包内的“刷卡条码/二维码”给商户系统扫描后直接完成支付的模式。主要应用线下面对面收银的场景。
扫码支付是商户系统按微信支付协议生成支付二维码,用户再用微信“扫一扫”完成支付的模式。该模式适用于PC网站支付、实体店单品或订单支付、媒体广告支付等场景。
公众号支付是用户在微信中打开商户的H5页面,商户在H5页面通过调用微信支付提供的JSAPI接口调起微信支付模块完成支付。应用场景有:
用户在微信公众账号内进入商家公众号,打开某个主页面,完成支付
用户的好友在朋友圈、聊天窗口等分享商家页面连接,用户点击链接打开商家页面,完成支付
将商户页面转换成二维码,用户扫描二维码后在微信浏览器中打开页面后完成支付
APP支付又称移动端支付,是商户通过在移动端应用APP中集成开放SDK调起微信支付模块完成支付的模式。
微信支付名称解释
1、微信公众平台
微信公众平台是微信公众账号申请入口和管理后台。商户可以在公众平台提交基本资料、业务资料、财务资料申请开通微信支付功能。
平台入口:http://mp.weixin.qq.com。
2、微信开放平台
微信开放平台是商户APP接入微信支付开放接口的申请入口,通过此平台可申请微信APP支付。
平台入口:http://open.weixin.qq.com。
3、微信商户平台
微信商户平台是微信支付相关的商户功能集合,包括参数配置、支付数据查询与统计、在线退款、代金券或立减优惠运营等功能。
平台入口:http://pay.weixin.qq.com。
4、微信企业号
微信企业号是企业号的申请入口和管理后台,商户可以在企业号提交基本资料、业务资料、财务资料申请开通微信支付功能。
企业号入口:http://qy.weixin.qq.com。
5、微信支付系统
微信支付系统是指完成微信支付流程中涉及的API接口、后台业务处理系统、账务系统、回调通知等系统的总称。
6、商户收银系统
商户收银系统即商户的POS收银系统,是录入商品信息、生成订单、客户支付、打印小票等功能的系统。接入微信支付功能主要涉及到POS软件系统的开发和测试,所以在下文中提到的商户收银系统特指POS收银软件系统。
7、商户后台系统
商户后台系统是商户后台处理业务系统的总称,例如:商户网站、收银系统、进销存系统、发货系统、客服系统等。
8、扫码设备
一种输入设备,主要用于商户系统快速读取媒介上的图形编码信息。按读取码的类型不同,可分为条码扫码设备和二维码扫码设备。按读取物理原理可分为红外扫码设备、激光扫码设备。
9、商户证书
商户证书是微信提供的二进制文件,商户系统发起与微信支付后台服务器通信请求的时候,作为微信支付后台识别商户真实身份的凭据。
10、签名
商户后台和微信支付后台根据相同的密钥和算法生成一个结果,用于校验双方身份合法性。签名的算法由微信支付制定并公开,常用的签名方式有:MD5、SHA1、SHA256、HMAC等。
11、JSAPI网页支付
JSAPI网页支付即前文说的公众号支付,可在微信公众号、朋友圈、聊天会话中点击页面链接,或者用微信“扫一扫”扫描页面地址二维码在微信中打开商户HTML5页面,在页面内下单完成支付。
12、Native原生支付
Native原生支付即前文说的扫码支付,商户根据微信支付协议格式生成的二维码,用户通过微信“扫一扫”扫描二维码后即进入付款确认界面,输入密码即完成支付。
13、支付密码
支付密码是用户开通微信支付时单独设置的密码,用于确认支付完成交易授权。该密码与微信登录密码不同。
14、Openid
用户在公众号内的身份标识,不同公众号拥有不同的openid。商户后台系统通过登录授权、支付通知、查询订单等API可获取到用户的openid。主要用途是判断同一个用户,对用户发送客服消息、模版消息等。企业号用户需要使用企业号userid转openid接口将企业成员的userid转换成openid。
支付账户
商户在微信公众平台(申请扫码支付、公众号支付)或开放平台(申请APP支付)按照相应提示,申请相应微信支付模式。微信支付工作人员审核资料无误后开通相应的微信支付权限。微信支付申请审核通过后,商户在申请资料填写的邮箱中收取到由微信支付小助手发送的邮件,此邮件包含开发时需要使用的支付账户信息,
微信审核通过邮件模板
邮件中的账户参数与接口API参数对应关系
邮件中参数 | API参数名 | 详细说明 |
---|---|---|
APPID | appid | appid是微信公众账号或开放平台APP的唯一标识,在公众平台申请公众账号或者在开放平台申请APP账号后,微信会自动分配对应的appid,用于标识该应用。可在微信公众平台-->开发者中心查看,商户的微信支付审核通过邮件中也会包含该字段值。 |
微信支付商户号 | mch_id | 商户申请微信支付后,由微信支付分配的商户收款账号。 |
API密钥 | key | 交易过程生成签名的密钥,仅保留在商户系统和微信支付后台,不会在网络中传播。商户妥善保管该Key,切勿在网络中传输,不能在其他客户端中存储,保证key不会被泄漏。商户可根据邮件提示登录微信商户平台进行设置。也可按一下路径设置:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置 |
Appsecret | secret | AppSecret是APPID对应的接口密码,用于获取接口调用凭证access_token时使用。在微信支付中,先通过OAuth2.0接口获取用户openid,此openid用于微信内网页支付模式下单接口使用。在开发模式中获取AppSecret(成为开发者且帐号没有异常状态)。 |
微信扫码支付接口规则
协议规则
商户接入微信支付,调用API必须遵循以下协议
传输方式 | 为保证交易安全性,采用HTTPS传输 |
---|---|
提交方式 | 采用POST方法提交 |
数据格式 | 提交和返回数据都为XML格式,根节点名为xml |
字符编码 | 统一采用UTF-8字符编码 |
签名算法 | MD5,后续会兼容SHA1、SHA256、HMAC等。 |
签名要求 | 请求和接收数据均需要校验签名,详细方法请参考安全规范-签名算法 |
证书要求 | 调用申请退款、撤销订单接口需要商户证书 |
判断逻辑 | 先判断协议字段返回,再判断业务返回,最后判断交易状态 |
参数规定
1、body字段格式要求
使用场景 | 支付模式 | 商品字段规则 | 样例 | 备注 |
---|---|---|---|---|
PC网站 | 扫码支付 | 浏览器打开的网站主页title名 -商品概述 | 腾讯充值中心-QQ会员充值 | |
微信浏览器 | 公众号支付 | 商家名称-销售商品类目 | 罗辑思维-图书 | 线上电商,商家名称必须为实际销售商品的商家 |
门店扫码 | 公众号支付 | 店名-销售商品类目 | 天虹南山店-超市 | 线下门店支付 |
门店扫码 | 扫码支付 | 店名-销售商品类目 | 天虹南山店-超市 | 线下门店支付 |
门店刷卡 | 刷卡支付 | 店名-销售商品类目 | 天虹南山店-超市 | 线下门店支付 |
第三方手机浏览器 | H5支付 | 浏览器打开的移动网页的主页title名-商品概述 | 腾讯充值中心-QQ会员充值 | |
第三方APP | APP支付 | 应用市场上的APP名字-商品概述 | 天天爱消除-游戏充值 |
2、交易金额
交易金额默认为人民币交易,接口中参数支付金额单位为【分】,参数值不能带小数。对账单中的交易金额单位为【元】。
外币交易的支付金额精确到币种的最小单位,参数值不能带小数点。
3、交易类型
JSAPI--公众号支付、NATIVE--原生扫码支付、APP--app支付,统一下单接口trade_type的传参可参考这里
MICROPAY--刷卡支付,刷卡支付有单独的支付接口,不调用统一下单接口
4、货币类型
货币类型的取值列表:CNY:人民币
5、时间
标准北京时间,时区为东八区;如果商户的系统时间为非标准北京时间。参数值必须根据商户系统所在时区先换算成标准北京时间, 例如商户所在地为0时区的伦敦,当地时间为2014年11月11日0时0分0秒,换算成北京时间为2014年11月11日8时0分0秒。
6、时间戳
标准北京时间,时区为东八区,自1970年1月1日 0点0分0秒以来的秒数。注意:部分系统取到的值为毫秒级,需要转换成秒(10位数字)。
7、商户订单号
商户支付的订单号由商户自定义生成,微信支付要求商户订单号保持唯一性(建议根据当前系统时间加随机序列来生成订单号)。重新发起一笔支付要使用原订单号,避免重复支付;已支付过或已调用关单、撤销(请见后文的API列表)的订单号不能重新发起支付。
8、银行类型
字符型银行编码 | 银行名称 |
---|---|
ICBC_DEBIT | 工商银行(借记卡) |
ICBC_CREDIT | 工商银行(信用卡) |
ABC_DEBIT | 农业银行(借记卡) |
ABC_CREDIT | 农业银行(信用卡) |
PSBC_DEBIT | 邮政储蓄银行(借记卡) |
PSBC_CREDIT | 邮政储蓄银行(信用卡) |
CCB_DEBIT | 建设银行(借记卡) |
CCB_CREDIT | 建设银行(信用卡) |
CMB_DEBIT | 招商银行(借记卡) |
CMB_CREDIT | 招商银行(信用卡) |
BOC_DEBIT | 中国银行(借记卡) |
BOC_CREDIT | 中国银行(信用卡) |
COMM_DEBIT | 交通银行(借记卡) |
SPDB_DEBIT | 浦发银行(借记卡) |
SPDB_CREDIT | 浦发银行(信用卡) |
GDB_DEBIT | 广发银行(借记卡) |
GDB_CREDIT | 广发银行(信用卡) |
CMBC_DEBIT | 民生银行(借记卡) |
CMBC_CREDIT | 民生银行(信用卡) |
PAB_DEBIT | 平安银行(借记卡) |
PAB_CREDIT | 平安银行(信用卡) |
CEB_DEBIT | 光大银行(借记卡) |
CEB_CREDIT | 光大银行(信用卡) |
CIB_DEBIT | 兴业银行(借记卡) |
CIB_CREDIT | 兴业银行(信用卡) |
CITIC_DEBIT | 中信银行(借记卡) |
CITIC_CREDIT | 中信银行(信用卡) |
BOSH_DEBIT | 上海银行(借记卡) |
BOSH_CREDIT | 上海银行(信用卡) |
CRB_DEBIT | 华润银行(借记卡) |
HZB_DEBIT | 杭州银行(借记卡) |
HZB_CREDIT | 杭州银行(信用卡) |
BSB_DEBIT | 包商银行(借记卡) |
BSB_CREDIT | 包商银行(信用卡) |
CQB_DEBIT | 重庆银行(借记卡) |
SDEB_DEBIT | 顺德农商行(借记卡) |
SZRCB_DEBIT | 深圳农商银行(借记卡) |
HRBB_DEBIT | 哈尔滨银行(借记卡) |
BOCD_DEBIT | 成都银行(借记卡) |
GDNYB_DEBIT | 南粤银行(借记卡) |
GDNYB_CREDIT | 南粤银行(信用卡) |
GZCB_DEBIT | 广州银行(借记卡) |
GZCB_CREDIT | 广州银行(信用卡) |
JSB_DEBIT | 江苏银行(借记卡) |
JSB_CREDIT | 江苏银行(信用卡) |
NBCB_DEBIT | 宁波银行(借记卡) |
NBCB_CREDIT | 宁波银行(信用卡) |
NJCB_DEBIT | 南京银行(借记卡) |
JZB_DEBIT | 晋中银行(借记卡) |
KRCB_DEBIT | 昆山农商(借记卡) |
LJB_DEBIT | 龙江银行(借记卡) |
LNNX_DEBIT | 辽宁农信(借记卡) |
LZB_DEBIT | 兰州银行(借记卡) |
WRCB_DEBIT | 无锡农商(借记卡) |
ZYB_DEBIT | 中原银行(借记卡) |
ZJRCUB_DEBIT | 浙江农信(借记卡) |
WZB_DEBIT | 温州银行(借记卡) |
XAB_DEBIT | 西安银行(借记卡) |
JXNXB_DEBIT | 江西农信(借记卡) |
NCB_DEBIT | 宁波通商银行(借记卡) |
NYCCB_DEBIT | 南阳村镇银行(借记卡) |
NMGNX_DEBIT | 内蒙古农信(借记卡) |
SXXH_DEBIT | 陕西信合(借记卡) |
SRCB_CREDIT | 上海农商银行(信用卡) |
SJB_DEBIT | 盛京银行(借记卡) |
SDRCU_DEBIT | 山东农信(借记卡) |
SRCB_DEBIT | 上海农商银行(借记卡) |
SCNX_DEBIT | 四川农信(借记卡) |
QLB_DEBIT | 齐鲁银行(借记卡) |
QDCCB_DEBIT | 青岛银行(借记卡) |
PZHCCB_DEBIT | 攀枝花银行(借记卡) |
ZJTLCB_DEBIT | 浙江泰隆银行(借记卡) |
TJBHB_DEBIT | 天津滨海农商行(借记卡) |
WEB_DEBIT | 微众银行(借记卡) |
YNRCCB_DEBIT | 云南农信(借记卡) |
WFB_DEBIT | 潍坊银行(借记卡) |
WHRC_DEBIT | 武汉农商行(借记卡) |
ORDOSB_DEBIT | 鄂尔多斯银行(借记卡) |
XJRCCB_DEBIT | 新疆农信银行(借记卡) |
ORDOSB_CREDIT | 鄂尔多斯银行(信用卡) |
CSRCB_DEBIT | 常熟农商银行(借记卡) |
JSNX_DEBIT | 江苏农商行(借记卡) |
GRCB_CREDIT | 广州农商银行(信用卡) |
GLB_DEBIT | 桂林银行(借记卡) |
GDRCU_DEBIT | 广东农信银行(借记卡) |
GDHX_DEBIT | 广东华兴银行(借记卡) |
FJNX_DEBIT | 福建农信银行(借记卡) |
DYCCB_DEBIT | 德阳银行(借记卡) |
DRCB_DEBIT | 东莞农商行(借记卡) |
CZCB_DEBIT | 稠州银行(借记卡) |
CZB_DEBIT | 浙商银行(借记卡) |
CZB_CREDIT | 浙商银行(信用卡) |
GRCB_DEBIT | 广州农商银行(借记卡) |
CSCB_DEBIT | 长沙银行(借记卡) |
CQRCB_DEBIT | 重庆农商银行(借记卡) |
CBHB_DEBIT | 渤海银行(借记卡) |
BOIMCB_DEBIT | 内蒙古银行(借记卡) |
BOD_DEBIT | 东莞银行(借记卡) |
BOD_CREDIT | 东莞银行(信用卡) |
BOB_DEBIT | 北京银行(借记卡) |
BNC_DEBIT | 江西银行(借记卡) |
BJRCB_DEBIT | 北京农商行(借记卡) |
AE_CREDIT | AE(信用卡) |
GYCB_CREDIT | 贵阳银行(信用卡) |
JSHB_DEBIT | 晋商银行(借记卡) |
JRCB_DEBIT | 江阴农商行(借记卡) |
JNRCB_DEBIT | 江南农商(借记卡) |
JLNX_DEBIT | 吉林农信(借记卡) |
JLB_DEBIT | 吉林银行(借记卡) |
JJCCB_DEBIT | 九江银行(借记卡) |
HXB_DEBIT | 华夏银行(借记卡) |
HXB_CREDIT | 华夏银行(信用卡) |
HUNNX_DEBIT | 湖南农信(借记卡) |
HSB_DEBIT | 徽商银行(借记卡) |
HSBC_DEBIT | 恒生银行(借记卡) |
HRXJB_DEBIT | 华融湘江银行(借记卡) |
HNNX_DEBIT | 河南农信(借记卡) |
HKBEA_DEBIT | 东亚银行(借记卡) |
HEBNX_DEBIT | 河北农信(借记卡) |
HBNX_DEBIT | 湖北农信(借记卡) |
HBNX_CREDIT | 湖北农信(信用卡) |
GYCB_DEBIT | 贵阳银行(借记卡) |
GSNX_DEBIT | 甘肃农信(借记卡) |
JCB_CREDIT | JCB(信用卡) |
MASTERCARD_CREDIT | MASTERCARD(信用卡) |
VISA_CREDIT | VISA(信用卡) |
安全规范
1、扫码支付签名算法------(签名校验工具)
签名生成的通用步骤如下:
第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特别注意以下重要规则:
参数名ASCII码从小到大排序(字典序);
如果参数的值为空不参与签名;
参数名区分大小写;
验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
微信接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步,在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
key设置路径:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置
假设传送的参数如下:
appid: wxd930ea5d5a258f4f mch_id: 10000100 device_info: 1000 body: test nonce_str: ibuaiVcKdpRxkhJA
第一步:对参数按照key=value的格式,并按照参数名ASCII字典序排序如下:
stringA="appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_id=10000100&nonce_str=ibuaiVcKdpRxkhJA";
第二步:拼接API密钥:
tringSignTemp="stringA&key=192006250b4c09247ec02edce69f6a2d" sign=MD5(stringSignTemp).toUpperCase()="9A0A8659F005D6984697E2CA0A9CF3B7"
最终得到最终发送的数据:
<xml> <appid>wxd930ea5d5a258f4f</appid> <mch_id>10000100</mch_id> <device_info>1000<device_info> <body>test</body> <nonce_str>ibuaiVcKdpRxkhJA</nonce_str> <sign>9A0A8659F005D6984697E2CA0A9CF3B7</sign> <xml>
2、生成随机数算法
微信支付API接口协议中包含字段nonce_str,主要保证签名不可预测。我们推荐生成随机数算法如下:调用随机数函数生成,将得到的值转换为字符串。
3、商户证书
(1)获取商户证书
微信支付接口中,涉及资金回滚的接口会使用到商户证书,包括退款、撤销接口。商家在申请微信支付成功后,收到的相应邮件后,可以按照指引下载API证书,也可以按照以下路径下载:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->证书下载 。
证书文件有四个,分别说明如下:
证书附件 | 描述 | 使用场景 | 备注 |
---|---|---|---|
pkcs12格式 (apiclient_cert.p12) | 包含了私钥信息的证书文件,为p12(pfx)格式,由微信支付签发给您用来标识和界定您的身份 | 撤销、退款申请API中调用 | windows上可以直接双击导入系统,导入过程中会提示输入证书密码,证书密码默认为您的商户ID(如:10010000) |
证书pem格式 (apiclient_cert.pem) | 从apiclient_cert.p12中导出证书部分的文件,为pem格式,请妥善保管不要泄漏和被他人复制 | PHP等不能直接使用p12文件,而需要使用pem,为了方便您使用,已为您直接提供 | 您也可以使用openssl命令来自己导出:openssl pkcs12 -clcerts -nokeys -in apiclient_cert.p12 -out apiclient_cert.pem |
证书密钥pem格式 (apiclient_key.pem) | 从apiclient_key.pem中导出密钥部分的文件,为pem格式 | PHP等不能直接使用p12文件,而需要使用pem,为了方便您使用,已为您直接提供 | 您也可以使用openssl命令来自己导出:openssl pkcs12 -nocerts -in apiclient_cert.p12 -out apiclient_key.pem |
CA证书 (rootca.pem) | 微信支付api服务器上也部署了证明微信支付身份的服务器证书,您在使用api进行调用时也需要验证所调用服务器及域名的真实性 | 该文件为签署微信支付证书的权威机构的根证书,可以用来验证微信支付服务器证书的真实性 | 部分工具已经内置了若干权威机构的根证书,无需引用该证书也可以正常进行验证,这里提供给您在未内置所必须根证书的环境中载入使用 |
(2)使用商户证书
apiclient_cert.p12是商户证书文件,除PHP外的开发均使用此证书文件。
商户如果使用.NET环境开发,请确认Framework版本大于2.0,必须在操作系统上双击安装证书apiclient_cert.p12后才能被正常调用。
商户证书调用或安装都需要使用到密码,该密码的值为微信商户号(mch_id)
PHP开发环境请使用商户证书文件apiclient_cert.pem和apiclient_key.pem ,rootca.pem是CA证书。
各版本的调用实例请参考微信支付提供的Demo外链。
(3)商户证书安全
证书文件不能放在web服务器虚拟目录,应放在有访问权限控制的目录中,防止被他人下载。商户服务器要做好病毒和木马防护工作,不被非法侵入者窃取证书文件。
4、商户回调API安全
在普通的网络环境下,HTTP请求存在DNS劫持、运营商插入广告、数据被窃取,正常数据被修改等安全风险。商户回调接口使用HTTPS协议可以保证数据传输的安全性。所以微信支付建议商户提供给微信支付的各种回调采用HTTPS协议。请参考:HTTPS搭建指南。
OpenID的获取指引
微信公众平台:
在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的。对于不同公众号,同一用户的openid不同)。
公众号可根据以下接口来获取用户的openid,如需获取用户的昵称、头像、性别、所在城市、语言和关注时间,则需要用户授权。
参考信息:http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html
开发者如果需要将同一个用户在不同公众号下的openid统一为一个id来记录,可以参考以下接口:
参考信息:http://mp.weixin.qq.com/wiki/14/bb5031008f1494a59c6f71fa0f319c66.html
微信开放平台:
移动应用获取用户openid可使用以下接口:
网站应用获取用户openid可使用以下接口:
微信扫码支付场景介绍
用户扫描商户展示在各种场景的二维码进行支付。
步骤1:商户根据微信支付的规则,为不同商品生成不同的二维码,展示在各种场景,用于用户扫描购买。
步骤2:用户使用微信“扫一扫”扫描二维码后,获取商品支付信息,引导用户完成支付。
步骤(3):用户确认支付,输入支付密码。
步骤(4):支付完成后会提示用户支付成功,商户后台得到支付成功的通知,然后进行发货处理。
未经允许请勿转载:程序喵 » 微信公众号开发教程——微信扫码支付开发者文档(上)