微信支付出现交易异常这种getBrandWCPayRequest:fail怎么解决?

微信支付文档 - 简书
微信支付文档
微信支付文档1.微信支付简介a)功能简介b)支付账户c)支付方式d)账号测试2.JS API支付接口a)支付场景b)功能交互c)获取当前微信版本号d)显示微信安全支付标题e)JS API支付接口(getBrandWCPayRequest)定义f)订单详情(packge)扩展字符串定义g)支付签名(paySign)生成方法h)接口使用实例3.Native(原生)支付接口a)支付场景b)基本交互c)Native(原生)支付接口描述d)Native(原生)支付URL定义e)Native(原生)支付URL签名方式f)Native(原生)支付回调商户后台获取package4.通知接口说明a)通知接口简介b)补单机制c)通知接口参数d)后台通知结果返回e)后台通知签名方式5.API接口说明a)API接口简介b)API使用方式c)API列表i.发货通知delivernotifyii.订单查询orderquery1.微信支付简介1.1功能简介微信支付,是基于微信客户端提供的支付服务功能。同时向商户提供销售经营分析、账户和资金管理的技术支持。用户通过扫描二维码、点击图文消息进入商品页面购买等多种方式调起微信支付模块完成支付。目前微信支持公众号内支付。其中支付方式,可以分为JS API支付、Native(原生)支付。商户可以结合业务场景,自主选择支付形式。本文将全面介绍公众号支付技术解决方案。1.2支付账户商户向微信公众平台提交企业信息以及银行账户资料,审核通过并签约后,可以获得以下帐户(包含财付通的相关支付资金账户),用于公众号支付。账号及其作用appId公众号身份唯一标识。appSecret公众平台API(参考文档API接口部分)的权限获取所需密钥Key,在使用所 有公众平台API时,都需要先用它去换取access_token,然后再进行调。paySignKey公众号支付请求中用于加密的密钥Key,可验证商户唯一身份,PaySignKey对应于支付场景中的appKey值。partnerId财付通商户身份标识。partnerKey财付通商户权限密钥Key。注意:appSecret、paySignKey、partnerKey是验证商户唯一性的安全标识,请妥善保管。对于appSecret和paySignKey的区别,可以这样认为:appSecret是API使用时的登录密码,会在网络中传播的;而paySignKey是在所有支付相关数据传输时用于加密并进行身份校验的密钥,仅保留在第三方后台和微信后台,不会在网络中传播。1.3支付方式公众号支付有2种方式:JS API支付:是指用户打开图文消息或者扫描二维码,在微信内置浏览器打开网页进行的支付。商户网页前端通过使用微信提供的JS API,调用微信支付模块。这种方式,适合需要在商户网页进行选购下单的购买流程。Native(原生)支付:是指商户组成符合Native(原生)支付规则的URL链接,用户可通过点击该链接或者扫描对应的二维码直接进入微信支付模块(微信客户端界面),即可进行支付。这种方式,适合无需选购直接支付的购买流程。以上两种支付方式,最大的差别在于是否需要经过网页调起支付。1.4测试账号名称及其取值appIdwxf8b4f85f3a794e77appSecretd01a3fe64d53f36892dfpaySignKey2Wozy2aksie1puXUBpWD8oZxiD1DfQuEaiC7KcRATv1Ino3mdopKaPGQQ7TtkNySuAmCaDCrw4xhPY5qKTBl7Fzm0RgR3c0W aVY IXZARsxzHV2x7iwPPzOz94dnwPWSnpartnerIdpartnerKey53e9cf7b0519d2.JSAPI支付接口2.1支付场景以下是支付场景的交互细节,请认真阅读,并设计商家页面的逻辑:(1)用户打开商户网页选购商品,发起支付,在网页通过JavaScript调用getBrandWCPayRequest接口,发起微信支付请求,用户进入支付流程。(2)商户设定订单轮询频率,前端开始轮询商户后台是否收到交易成功通知。若某时刻收到通知,即刷新前端页面。订单查询请参考下文的订单查询的API接口。(3)用户成功支付点击完成按钮后,商户的前端会收到JavaScript的返回值。此时,若商家已收到后台成功的通知,则向用户展示支付成功;若未收到支付成功的后台通知,需 要后台再主动发起查询订单状态请求,前端显示结果,不能只依靠前端的JavaScript返回值。 简单地说,支付成功务必以后台状态为准,前端判断为辅。注:(3)中的JS API返回值只在支付成功时返回,但并不表示JS API无返回或者有其 他返回值时就一定失败。鉴于以上极少数的情况,微信团队建议商户在调起微信支付后,前 端页面能够提供用户主动查询订单状态的入口,待用户结束支付流程回到商户网页前端界面时能够主动触发商户后台主动查询订单结果。以上会影响用户的支付成功体验,请仔细阅读并设计好网页处理逻辑。2.2功能交互商品类型图文消息或者通过二维码扫描进入商品网页内调用JS API支付,点击立即购买进入输入支付密码环节,密码成功后进入支付成功界面,最后返回商家页面提示发货。2.3获取当前微信版本号由于微信5.0版本后才加入微信支付模块,低版本用户调用微信公众号支付将无效。因 此,微信团队建议商户通过user agent来确定用户当前的版本号后再调用支付接口 。以iPhone版本为例,可以通过user agent可获取如下微信版本示例信息:"Mozilla/5.0(CPU iphone OS 5_1_1 like Mac OS X)AppleWebKit/534.46(KHTML,like Geocko) Mobile/9B206 MicroMessenger/5.0"其中5.0为用户安装的微信版本号,商户可以判定版本号是否高于或者等于5.0。2.4显示微信安全支付标题对于商户具有支付权限且需要调用微信支付的页面,为了让用户增加购买信心,确认交 易环境安全,微信强烈建议商户使用“微信安全支付”标题。显示支付安全标题,除了需要商户具有支付权限,还需将原始链接添加上"showwxpaytitle=1"的尾串。通过这种方式,商户的页面将出现微信安全支付的标识。例如,原始url为:htp://weixin.qq.com,显示安全支付标题的url为: htp://weixin.qq.com?showwxpaytitle=1。当用户在微信里打开http://weixin.qq.com不会直接出现微信安全支付的标题,而打开htp://weixin.qq.com?showwxpaytitle=1后将出现微信安全支付标题。2.5JSAPI支付接口(getBrandWCPayRequest)定义微信JS API只能在微信内置浏览器中使用,其他浏览器调用无效。微信提 供getBrandWCPayRequest接口供商户前端网页调用,调用之前微信会鉴定商户支付权限,若 商户具有调起支付的权限,则将开始支付流程 。这里主要介绍支付前的接口调用规则,支付 状态消息通知机制请参加下文。接口需要注意:所有传入参数都是字符串类型!getBrandWCPayRequest参数以及返回值定义参数以及是否必须填写和说明appId:必填:字段名称:公众号字段来源:商户注册具有支付权限的公众号成功后即可获得;传入方式:由商户直接传入。参数类型:字符串类型timestamp:必填:字段名称:时间戳;字段来源:商户生成从日00:00:00至今的秒数,即当前的时间,且最终需要转换为字 符串形式;由商户生成后传入。 参数类型:字符串类型;参数长度: 32个字节以下。nonceStr:必填:字段名称:随机字符串;字段来源:商户生成的随机字符串 。 由商户生成后传入。参数类型:字符串类型;参数长度: 32个字节以下。Package:必填:字段名称:扩展字符串;参数类型:字符串类型;字段来源:商户将订单信息组成该字符串,具体组成方案参见接口使用说 明中package组包帮助;由商户按照规范拼接后传入。 参数类型:字符串类型;参数长度: 4096个字节以下。signType:必填:字段名称:签名方式;参数类型:字符串类型;字段来源:按 照文档中所示填入,目前仅支持SHA1;参数类型:字符串类型;参数取值: "SHA1"。paySign:必填:字段名称:签名;字段来源:商户将接口列表中的参数按照指 定方式进行签名,签名方式使用signType中标示的签名方式,具体签名方案参见接口使用说明中签名帮助;由商户按照规范 签名后传入。参数类型:字符串类型;参数长度: 40个字符。返回结果返回值:err_msgget_brand_wcpay_request:ok支付成功注:JSAPI的返回结果get_brand_wcpay_request:ok仅在用户成功完成支付时返回,其他情 况下函数将无返回或返回其他无意义的结果,商户可以不予理会,更不应该以其他返回值作为判定支付成功或失败的条件。2.6订单详情(package)扩展字符串定义在商户调起JS API时,商户需要此时确定该笔订单详情,并将该订单详情通过一定的 方式进行组合放入package。JS API调用后,微信将通过package的内容生成预支付单。下 面将定义package的所需字段列表以及签名方法。package所需字段参数及其是否必填和说明bank_type:必填:银行通道类型,由于这里是使用的微信公众号支付,因此 这个字段固定为WX,注意大写。参数取值:"WX"。Body:必填:商品描述。参数长度:128字节以下。Attach:非必填:附加数据,原样返回。128字节以下。Partner:必填:商户号,即注册时分配的partnerId。out_trade_no:必填:商户系统内部的订单号,32个字符内、可包含字母,确保在商 户系统唯一。参数取值范围:32字节以下。total_fee:必填:订单总金额,单位为分。fee_type:必填:现金支付币种,取值:1(人民币),默认值是1,暂只支持1.notify_url:必填:通知URL,在支付完成后,接收微信通知支付结果的URL,需给绝对径路,255字符内,格式如:http://wap.tenpay.com/tenpay.asp。取值范围:255字节以内。spbill_create_ip:必填:订单生成的机器IP,指用户浏览器端IP,不是商户服务器IP,格式为IPV4整型。取值范围:15字节以内。time_start:非必填:交易起始时间,也是订单生成时间,格式 为yyyyMMddHHmmss,如日9点10分10秒表示为10。时区为GMT+8 beijing。该时 间取自商户服务器。取值范围:14字节。time_expire:非必填:交易结束时间,也是订单失效时间,格式 为yyyyMMddHHmmss,如日9点10分10秒表示为10。时区为GMT+8 beijing。该时 间取自商户服务器。取值范围:14字节。transport_fee:非必填:物流费用,单位为分。如果有值,必须保证transport_fee + product_fee=total_fee。product_fee:非必填:商品费用,单位为分。如果有值,必须保证transport_fee + product_fee=total_fee。goods_tag:非必填:商品标记,优惠券时可能用到。input_charset:必填:传入参数字符编码。取值范围: "GBK"、"UTF-8"。默认: "GBK"。package生成方法由于package中携带了生成订单的详细信息,因此在微信将对package里面的内容进行鉴权,确定package携带的信息是真实、有效、合理的。因此,这里将定义生成package字符串的方法。a.对所有传入参数按照字段名的ASCII码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2...)拼接成字符串string1;b.在string1最后拼接上key=paternerKey得到stringSignTemp字符串,并对stringSignTemp进行md5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。c.对string1中的所有键值对中的value进行urlencode转码,按照a步骤重新拼接成字符串,得到string2。对于js前端程序,一定要使用函数encodeURIComponent进行urlencode编码(注意!进行urlencode时要将空格转化为%20而不是+)。d.将sign=signValue拼接到string1后面得到最终的package字符串。下面定义了一段生成package字符串的示范过程:假设以下为package传入参数:bank_type=WX;fee_type=1,body=XXX,input_charset=GBK,partner=,total_fee=1,spbill_create_ip=127.0.0.1out_trade_no= ,notify_url=http://www.qq.comi :经过a过程url键值对字典序排序后的字符串string1为:bank_type=WX&body=XXX&fee_type=1&input_charset=GBK?ify_url=http://www.qq.com&out_trade_no=&partner=&spbill_create_ip=127.0.0.1&total_fee=1ii:经过b过程后得到sign为:sign=md5(string1&key=53e9cf7b0519d).toUpperCase=md5(bank_type=WX&body=XXX&fee_type=1&input_charset=GBK?ify_url=http://www.qq.com&out_trade_no=&partner=&spbill_create_ip=127.0.0.1&total_fee=1&key=53e9cf7b0519d).toUpperCase()="beef37adc1e4b1474ca9".toUpperCase()=”BEEF37ADC1E4B1474CA9”iii:再对string1中的每一个键值对中的value进行urlencode编码后得到:bank_type=WX&body=XXX&fee_type=1&input_charset=GBK?ify_url=http%3a%2f%2fwww.qq.com&out_trade_no=&partner=&spbill_create_ip=127.0.0.1&total_fee=1iv:拼接上sign后得到最终package结果:bank_type=WX&body=XXX&fee_type=1&input_charset=GBK?ify_url=http%3a%2f%2fwww.qq.com&out_trade_no=&partner=&spbill_create_ip=127.0.0.1&total_fee=1&sign=BEEF37ADC1E4B1474CA92.7支付签名(paySign)生成方法paySign字段是对本次发起JS API的行为进行鉴权,只有通过了paySign鉴权,才能继 续对package鉴权并生成预支付单。这里将定义paySign的生成规则。参与paySign签名的字段包括: appid、timestamp、noncestr、package以及appkey。这里signType并不参与签名。对所有待签名参数按照字段名的ASCII码从小到大排序(字典序)后,使用URL键值 对的格式(即key1=value1&key2=value2...)拼接成字符串string1。这里需要注意的是所有参数名均为小写字符,例如appId在排序后字符串则为对string1作签名算法,字段名和字段值都采用原始值(此时package的value就对应了使用2.6中描述的方式生成的package),不进行URL转义。具体签名算法为paySign=SHA1(string)。这里给出生成paySign的具体示例如下:假设参数如下:"appId":"wxf8b4f85f3a794e77","timeStamp":"","nonceStr":"adssdasssd13d","package":"bank_type=WX&body=XXX&fee_type=1&input_charset=GBK?ify_url=http%3a%2f%2fwww.qq.com&out_trade_no=&partner=&spbill_create_ip=127.0.0.1&total_fee=1&sign=BEEF37ADC1E4B1474CA9"a pp K e y ”: " 2 W o z y 2 a k s i e 1 p u X U B p W D 8 o Z x i D 1 D f Q uE a i C 7 K c R A T v 1 I n o 3 m d o p K a P G Q Q 7 T t k NySuAmCaDCrw4xhPY5qKTBl7Fzm0RgR3c0WaVYIXZARsxzHV2x7iwPPzOz94dnwPWSn”i:经过a过程键值对排序后得到string1为:appid=wxf8b4f85f3a794e77&appkey=2Wozy2aksie1puXUBpWD8oZxiD1DfQuEaiC7KcRATv1Ino3mdopKaPGQQ7TtkNySuAmCaDCrw4xhPY5qKTBl7Fzm0RgR3c0WaVYIXZARsxzHV2x7iwPPzOz94dnwPWSn&noncestr=adssdasssd13d&package=bank_type=WX&body=XXX&fee_type=1&input_charset=GBK?ify_url=http%3a%2f%2fwww.qq.com&out_trade_no=&partner=&spbill_create_ip=127.0.0.1&total_fee=1&sign=BEEF37ADC1E4B1474CA9×tamp=ii:经过b过程签名后可得到:paySign=SHA1(appid=wxf8b4f85f3a794e77&appkey=2Wozy2aksie1puXUBpWD8oZxiD1DfQuEaiC7KcRATv1Ino3mdopKaPGQQ7TtkNySuAmCaDCrw4xhPY5qKTBl7Fzm0RgR3c0WaVYIXZARsxzHV2x7iwPPzOz94dnwPWSn&noncestr=adssdasssd13d&package=bank_type=WX&body=XXX&fee_type=1&input_charset=GBK?ify_url=http%3a%2f%2fwww.qq.com&out_trade_no=&partner=&spbill_create_ip=127.0.0.1&total_fee=1&sign=BEEF37ADC1E4B1474CA9×tamp=)=afe9a0de2.8接口使用示例接口需要注意:所有传入参数都是字符串类型!示例代码如下:WeixinJSBridge.invoke('getBrandWCPayRequest',{"appId" : "wxf8b4f85f3a794e77", //公众号名称,由商户传入"timeStamp" :"", //时间戳 这里随意使用了一个值"nonceStr" : "adssdasssd13d", //随机串"package":"bank_type=WX&body=XXX&fee_type=1&input_charset=GBK?ify_url=http%3a%2f%2fwww.qq.com&out_trade_no=&partner=&spbill_create_ip=127.0.0.1&total_fee=1&sign=BEEF37ADC1E4B1474CA9",//扩展字段,由商户传入"signType": "SHA1", //微信签名方式:sha1"paySign": "afe9a0de" //微信签名},function(res){//返回res.err_msg,取值//get_brand_wcpay_request:cancel用户取消//get_brand_wcpay_request:fail发送失败//get_brand_wcpay_request:ok发送成功WeixinJSBridge.log(res.err_msg);alert(res.err_code+res.err_desc);});3.Native(原生)支付接口3.1支付场景(1)商户如果想具有Native(原生)支付的权限,除了需要填写申请支付权限的必须信息,还需要提供一个获取订单package的回调URL,以便微信后台通过Post的方式去获取该笔 支付的订单信息。(2)商户根据微信指定的规则制定用于微信支付的URL字符串,当用户点击该字符串,或 者通过扫描该字符串对应的二维码时,微信后台开始进入预支付流程。(3)微信后台鉴定权限后,通过Post方式向商户后台获取生成订单的必要信息,再次鉴定 获取的信息成功后,客户端将进入支付流程。(4)支付成功后,微信后台将通过Post机制通知商户后台该笔交易已成功。3.2基本交互商品类图文消息和商品二维码都可进行支付,直接支付,不需要经过网页,然后点击支付,进入输入密码环节,然后完成后就是支付成功。3.3Native(原生)支付接口描述Native(原生)支付过程中,首先需要商户定义符合Native(原生)支付规范的URL,也就是Native(原生)支付URL,同时需要在微信后台Post商户后台时需要提供package内容。因此这里将重点介绍支付前的接口调用,支付通知等信息请查看下文。3.4Native(原生)支付URL定义Native(原生)支付URL是一系列具有weixin://wxpay/bizpayurl?前缀的url,同时后面紧跟着一系列辨别商家的键值对。Native(原生)支付URL的规则如下:weixin://wxpay/bizpayurl?sign=XXXXX&appid=XXXXXX&productid=XXXXXX×tamp=XXXXXX&noncestr=XXXXXX其中xxxxxx为商户需要填写的内容,具体参数定义如下:参数及其是否必填和说明appid:必填:字段名称:公众号字段来源:商户注册具有支付权限的公众 号成功后即可获得;传入方式:由商户直接传入。Timestamp:必填:字段名称:时间戳;字段来源:商户生成从日00: 00:00至今的秒数,即当前的时间;由商户生成后传入。取值 范围:32字符以下Noncestr:必填:字段名称:随机字符串;字段来源:商户生成的随机字符串;取值范围:长度为32个字符以下。由商户生成后传入。取值范围: 32字符以下Productid:必填:字段名称:商品唯一字段来源:商户需要定义并维护自己的 商品id,这个id与一张订单等价,微信后台凭借该id通过Post商户后台获取交易必须信息 。由商户生成后传入 。取值范围:32字符以下Sign:必填:字段名称:签名;字段来源:对前面的其他字段与appKey按照 字典序排序后,使用SHA1算法得到的结果。由商户生成后传入。3.5Native(原生)支付URL签名方式参与sign签名的字段包括:appid、timestamp、noncestr、productid以及appkey。a.对所有待签名参数按照字段名的ASCII码从小到大排序(字典序)后,使用URL键 值对的格式(即key1=value1&key2=value2...)拼接成字符串string1。这里需要注意的是所 有参数名均为小写字符,即appId则排序后的字符串则为b.对string1作签名算法,字段名和字段值都采用原始值,不进行URL转义。具体签名算法为sign=SHA1(string)。这里给出生成sign的具体示例如下:假设参数如下:"appid":"wxf8b4f85f3a794e77","timestamp":"","noncestr":"adssdasssd13d", "productid" :"123456"“appkey”:"2W ozy2aksie1puXUBpWD8oZxiD1DfQuEaiC7KcRA Tv1Ino3mdopKaPGQQ7TtkNySuAmCaDCrw4xhPY5qKTBl7Fzm0RgR3c0WaVYIXZARsxzHV2x7iwPPzOz94dnwPWSn”则经过a过程后得到:string1=“appid=wxf8b4f85f3a794e77&appkey=2Wozy2aksie1puXUBpWD8oZxiD1DfQuEaiC7KcRATv1Ino3mdopKaPGQQ7TtkNySuAmCaDCrw4xhPY5qKTBl7Fzm0RgR3c0WaVYIXZARsxzHV2x7iwPPzOz94dnwPWSn&noncestr=adssdasssd13d&productid=123456×tamp=”则经过SHA1处理后得到:sign=18ce946ae294e016eddda9468de80df3.6Native(原生)支付回调商户后台获取package在公众平台接到用户点击上述特殊Native(原生)支付的URL之后,会调用注册时填 写的商家获取订单Package的回调URL。假设回调URL为https://www.outdomain.com/cgi-bin/bizpaygetpackage微信公众平台调用时会使用Post方式,推送xml格式的PostData,形如:1 ure&参数说明:(1)AppId,公众帐号的appid(2)OpenId,点击链接准备购买商品的用户openid (3)IsSubscribe,标记用户是否订阅该公众帐号, 1为关注,0为未关注(4)ProductId,第三方的商品ID号(5)TimeStamp,时间戳(6)NonceStr,随机串(7)AppSignature,参数的加密签名,是根据2.7支付签名( paySign)生成方法中所讲的签名方式生成的签名(8)SignMethod,签名方式,目前只支持“SHA1”。该字段不参与签名。第三方为了确保是来自于微信公众平台的合法请求,需要使用同样的方式生成签名,并与AppSignature的值进行对比。参与签名的字段为:appid、appkey、productid、timestamp、noncestr、openid、issubscribe。 为了返回Package数据,回调URL必须返回一个xml格式的返回数据,形如:微信公众号支付接口文档V2.21 A[afecdacb9e]]&
其中,AppSignature依然是根据前文paySign所讲的签名方式生成的签名,参与签名的 字段为:appid、appkey、package、timestamp、noncestr、retcode、reterrmsg。package的生成规则请参考JS API所定义的package生成规则。这里就不再赘述了。其中,对于一些第三方觉得商品已经过期或者其他错误的情况,可以在RetCode和RetErrMsg中体现出来,RetCode为0表明正确,可以定义其他错误;当定义其他错误时,可以在RetErrMsg中填上UTF8编码的错误提示信息,比如“该商品已经下架”,客户端会 直接提示出来。4.通知接口说明4.1通知接口简介用户在成功完成支付后,微信后台通知( post)商户服务器(notify_url)支付结果。商户可以使用notify_url的通知结果进行个性化页面的展示。4.2补单机制对后台通知交互时,如果微信收到商户的应答不是success或超时,微信认为通知失败,微信会通过一定的策略(如30分钟共8次)定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功。由于存在重新发送后台通知的情况,因此同样的通知可能会多次发送给商户系统 。商户系统必须能够正确处理重复的通知。微信推荐的做法是,当收到通知进行处理时,首先检查对应业务数据的状态,判断该通知是否已经处理过,如果没有处理过再进行处理,如果处理过直接返回success。在对业务 数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混 乱。目前补单机制的间隔时间为: 8s、10s、10s、30s、30s、60s、120s、360s、1000s。4.3通知接口参数后台通知通过请求中的notify_url进行,采用post机制。返回通知中的参数一致, url包含如下内容:字段名:变量名:必填:类型:说明协议参数:签名方式:sign_type:否:String(8):签名类型,取值:MD5、RSA,默认:MD5接口版本:service_version:否:String(8):版本号,默认为1.0字符集:input_charset:否:String(8):字符编码,取值:GBK、UTF-8,默认:GBK。签名:sign:是:String(32):签名密钥序号:sign_key_index:否:Int:多密钥支持的密钥序号,默认1业务参数:交易模式:trade_mode:是:int:1-即时到账其他保留交易状态:trade_state:是:int:支付结果: 0—成功 其他保留支付结果信息:pay_info:否:String(64):支付结果信息,支付成功时为空商户号:partner:是:String(10):商户号,也即之前步骤的partnerid,由微信统一分配的10位正整数(120XXXXXXX)号付款银行:bank_type:是:String(16):银行类型,在微信中使用WX银行订单号:bank_billno:否:String(32):银行订单号总金额:total_fee:是:int:支付金额,单位为分,如 果discount有值,通知的total_fee + discount =请求的total_fee币种:fee_type:是:int:现金支付币种,目前只支持人 民币,默认值是1-人民币通知ID:notify_id:是:String(128):支付结果通知id,对于某些特 定商户,只返回通知id,要求 商户据此查询交易结果订单号:transaction_id:是:String(28):交易号,28位长的数值,其中前10位为商户号,之后8位为订单产生的日期,如,最后10位是流水号。商户订单号:out_trade_no:是:String(32):商户系统的订单号,与请求一致。商家数据包:attach:否:String(127):商家数据包,原样返回支付完成时间:time_end:是:String(32):支付完成时间,格式 为yyyyMMddhhmmss ,如日9点10分10秒 表示为10。时区 为GMT+8 beijing。物流费用:transport_fee:否:int:物流费用,单位分,默认0。 如果有值,必须保 证transport_fee+ product_fee = total_fee物品费用:product_fee:否:int:物品费用,单位分 。如果有值,必须保证transport_fee + product_fee=total_fee折扣价格:discount:否:int:折扣价格,单位分,如果有值,通知的total_fee + discount =请求的total_fee买家别名:buyer_alias:否:String(64):对应买家账号的一个加密串同时,在postData中还将包含xml数据。数据如下:1
各字段定义如下:参数:必填:说明AppId:是:字段名称:公众号字段来源:商户注册具有支付权限 的公众号成功后即可获得;传入方式:由商户直接传入。TimeStamp:是:字段名称:时间戳;字段来源:商户生成从日00:00:00至今的秒数,即当前的时间;由商户生成后 传入。取值范围:32字符以下NonceStr:是:字段名称:随机字符串;字段来源:商户生成的随机字符 串;取值范围:长度为32个字符以下。由商户生成后传入。 取值范围:32字符以下OpenId:是;支付该笔订单的用户ID,商户可通过公众号其他接口为付 款用户服务。AppSignature:是:字段名称:签名;字段来源:对前面的其他字段与appKey按照字典序排序后,使用SHA1算法得到的结果。由商户生成后传入。IsSubscribe:是:用户是否关注了公众号。1为关注,0为未关注。AppSignature依然是根据前文paySign所述的签名方式生成,参与签名的字段为:appid、appkey、timestamp、noncestr、openid、issubscribe。从以上信息可以看出, url参数中携带订单相关信息,postData中携带该次支付的用户 相关信息,这将便于商家拿到openid,以便后续提供更好的售后服务。4.4后台通知结果返回微信后台通过notify_url通知商户,商户做业务处理后,需要以字符串的形式反馈处理结果,内容如下:返回结果:结果说明success:处理成功,微信系统收到此结果后不再进行后续通知fail或其它字符:处理不成功,微信收到此结果或者没有收到任何结果,系统通过补单机 制再次通知4.5后台通知签名方式对于url中签名原始串按以下方式组装成字符串:a.除sign字段外,所有参数按照字段名的ascii码从小到大排序后使用QueryString的格 式(即key1=value1&key2=value2...)拼接而成字符串string1,空值不传递,不参与签名组串。b.在string1最后拼接上key=paternerKey得到stringSignTemp字符串,并 对stringSignTemp进行md5运算,再将得到的字符串所有字符转换为大写,得到sign值signV alue。c.对string1进行urlencode转码,得到string2。d.将sign=signValue拼接到string1后面得到最终的notifyargs字符串。e.所有参数是指通信过程中实际出现的所有非空参数,即使是接口中无描述的字段,也需要参与签名组串 。f.签名原始串中,字段名和字段值都采用原始值,不进行URLEncode。g.微信通知消息可能会由于升级增加参数,请验证应答签名时注意允许这种情况。下面定义了一段生成notifyargs字符串的示范过程:假设以下为notifyargs传入参数: bank_billno= ,bank_type=0,discount=0,fee_type=1,input_charset=GBK,notify_id=WE37gwCoFBcAKdkH34Y1nW94r_vao2ljmwE3oAHEeAP690xSVhRleOMfhsgjwVGDpluT-vdS79kbDbkDnjYg4qsmTdSjuJxl,out_trade_no=809900, partner= , product_fee=1,sign_type=MD5, time_end=31 , total_fee=1,trade_mode=1,trade_state=0,transaction_id=5397, transport_fee=0i:经过a过程url键值对字典序排序后的字符串string1为:bank_billno=&bank_type=0&discount=0&fee_type=1&input_charset=GBK?ify_id=WE37gwCoFBcAKdkH34Y1nW94r_vao2ljmwE3oAHEeAP690xSVhRleOMfhsgjwVGDpl uT-vdS79kbDbkDnjYg4qsmTdSjuJxl&out_trade_no=809900&partner=&product_fee=1&sign_type=MD5&time_end=31&total_fee=1&trade_mode=1&trade_state=0&transaction_id=5397&transport_fee=0ii:经过b过程后得到sign为:sign=md5(string1&key=53e9cf7b0519d).toUpperCase=md5(bank_billno=&bank_type=0&discount=0&fee_type=1&input_charset=GBK?ify_id=WE37gwCoFBcAKdkH34Y1nW94r_vao2ljmwE3oAHEeAP690xSVhRleOMfhsgjwVGDpluT-vdS79kbDbkDnjYg4qsmTdSjuJxl&out_trade_no=809900&partner=&product_fee=1&sign_type=MD5&time_end=31&total_fee=1&trade_mode=1&trade_state=0&transaction_id=5397&transport_fee=0&key=53e9cf7b0519d).toUpperCase()="8ef1f69d5d9d4ec39d24e".toUpperCase()=”8EF1F69D5D9D4EC39D24E”iii:再对string1经过c过程urlencode编码后得到:bank_billno=&bank_type=0&discount=0&fee_type=1&input_charset=GBK?ify_id=WE37gwCoFBcAKdkH34Y1nW94r_vao2ljmwE3oAHEeAP690xSVhRleOMfhsgjwVGDpluT-vdS79kbDbkDnjYg4qsmTdSjuJxl&out_trade_no=809900&partner=&product_fee=1&sign_type=MD5&time_end=31&total_fee=1&trade_mode=1&trade_state=0&transaction_id=5397&transport_fee=0iv:拼接上sign后得到最终package结果:bank_billno=&bank_type=0&discount=0&fee_type=1&input_charset=GBK?ify_id=WE37gwCoFBcAKdkH34Y1nW94r_vao2ljmwE3oAHEeAP690xSVhRleOMfhsgjwVGDpluT-vdS79kbDbkDnjYg4qsmTdSjuJxl&out_trade_no=809900&partner=&product_fee=1&sign_type=MD5&time_end=31&total_fee=1&trade_mode=1&trade_state=0&transaction_id=5397&transport_fee=0&sign=8EF1F69D5D9D4EC39D24E5.API接口说明5.1API接口简介为了更好地接入支付的整个流程,包括购买、通知、发货等,微信提供了一系列的支付 相关API,以供第三方调用。5.2API使用方式在使用API之前,需要拥有API使用过程中用到的具有时效性的凭证access_token。这 个获取方式就是使用前文提到的appid和appsecret调用token这个api获取。更详细的文档 请参考:http://mp.weixin.qq.com/wiki说明文档中的通用接口。只有拥有了有效access_token (即相当于具有了一定时间内的API登陆态)后续的所有API调用才会成功。5.3API列表5.3.1发货通知delivernotify为了更好地跟踪订单的情况,需要第三方在收到最终支付通知之后,调用发货通知API告知微信后台该订单的发货状态。请在收到支付通知发货后,一定调用发货通知接口,否则可能影响商户信誉和资金结算。Api的url为:https://api.weixin.qq.com/pay/delivernotify?access_token=xxxxxxUrl中的参数只包含目前微信公众平台凭证access_token,而发货通知的真正的数据是放在PostData中的,格式为json,如下:{"appid" : "wwwwb4f85f3a797777","openid" : "oX99MDgNcgwnz3zFN3DNmo8uwa-w","transid" : "333","out_trade_no" : "555666uuu","deliver_timestamp" : "","deliver_status" : "1","deliver_msg" : "ok","app_signature" :"53cca9d47b883bd4a5c85acb48565c", "sign_method" :"sha1"}其中,appid是公众平台账户的AppId;openid是购买用户的OpenId,这个已经放在最终支付结果通知的PostData里了; transid是交易单号;out_trade_no是第三方订单号;deliver_timestamp是发货时间戳,这里指得是linux时间戳;deliver_status是发货状态,1表明成功,0表明失败,失败时需要在deliver_msg填上失败原因;deliver_msg是发货状态信息,失败时可以填上UTF8编码的错误提示信息,比如“该商品已退款”;app_signature依然是根据1中所讲的签名方式生成的签名,参加签名字段为: appid、appkey、openid、transid、out_trade_no、deliver_timestamp、deliver_status、deliver_ sign_method是签名方法(不计入签名生成);微信公众平台在校验ok之后,会返回数据表明是否通知成功,例如: {"errcode":0,"errmsg":"ok"}如果有异常,会在errcode和errmsg描述出来,如果成功errcode就为0。5.3.2订单查询orderquery因为某一方技术的原因,可能导致商家在预期时间内都收不到最终支付通知,此时商家 可以通过该API来查询订单的详细支付状态。Api的url为:https://api.weixin.qq.com/pay/orderquery?access_token=xxxxxxUrl中的参数只包含目前微信公众平台凭证access_token,而发货通知的真正的数据是 放在PostData中的,格式为json,如下:{"appid" : "wwwwb4f85f3a797777","package" : "out_trade_no=11122&partner=&sign=4e8d0df3da0c3d0df38f","timestamp" : "","app_signature" :"53cca9d47b883bd4a5c85acb48565c","sign_method" : "sha1"}其中,appid是公众平台账户的AppId;package是查询订单的关键信息数据,包含第三方唯一订单号out_trade_no、财付通商户身份标识partner(即前文所述的partnerid)、签名sign,其中sign是对参数字典序排序并使用&联合起来,最后加上&key=partnerkey(唯一分配),进行md5运算,再转成全大写,最终得到sign,对于示例,就是:sign=md5(out_trade_no=11122&partner=&key=xxxxxx ).timestamp是linux时间戳;app_signature依然是根据1中所讲的签名方式生成的签名,参加签名字段为:appkey、package、sign_method是签名方法(不计入签名生成);微信公众平台在校验ok之后,会返回数据表明是否通知成功,例如: {"errcode":0,"errmsg":"ok", ...... }如果有异常,会在errcode和errmsg描述出来,如果成功errcode就为0。如果查询成功,会返回详细的订单数据,如下:{"errcode":0, "errmsg":"ok","order_info":{"ret_code":0,"ret_msg":"","input_charset":"GBK","trade_state":"0", "trade_mode":"1","partner":"","bank_type":"CMB_FP", "bank_billno":"","total_fee":"1","fee_type":"1","transaction_id":"3741","out_trade_no":"6457300","is_split":"false","is_refund":"false","attach":"","time_end":"43","transport_fee":"0","product_fee":"1","discount":"0", "rmb_total_fee":""} }对于详细的订单信息,放在order_info中的json数据中,各个字段的含义如下: ret_code是查询结果状态码,0表明成功,其他表明错误;ret_msg是查询结果出错信息;input_charset是返回信息中的编码方式;trade_state是订单状态,0为成功,其他为失败;trade_mode是交易模式,1为即时到帐,其他保留; partner是财付通商户号,即前文的 bank_type是银行类型;bank_billno是银行订单号;total_fee是总金额,单位为分;fee_type是币种,1为人民币;transaction_id是财付通订单号;out_trade_no是第三方订单号;is_split表明是否分账,false为无分账,true为有分账; is_refund表明是否退款,false为无退款,ture为退款;attach是商家数据包,即生成订单package时商家填入的 time_end是支付完成时间;transport_fee是物流费用,单位为分; product_fee是物品费用,单位为分;discount是折扣价格,单位为分;rmb_total_fee是换算成人民币之后的总金额,单位为分,一般看total_fee即可。付接口
拿起手中的笔,书写最感动的瞬间
引言 秋高气爽,天气转凉,正是学习工作做的好时候。(~ ̄▽ ̄)~~(~ ̄▽ ̄)~ 我是个phper最近在写微信支付(APP支付),微信给的官方文档并不是很详细也没有dome之类的代码啥的(对于新手来说比较麻烦),本人是新手以前也没写过支付,踩了好多坑,所以想写篇文章给没写过...
文章最早发布于我的微信公众号中,欢迎关注公众号 Android_De_Home 获取更多干货资源。本文为sydMobile原创文章,可以随意转载,但请务必注明出处! 以前公司的支付都是用的ping++,最近一段时间想要修改成原生的支付,微信、支付都直接接入原生的,在实际开发...
支付宝简介文档 (适用于ydm-java接口与后台,如有误入,但愿也能给您带来帮助) 此文档写于2017年3月,只能说明此时该文档适用。使用前请查看以下接口支付宝是否提供。 App支付产品 批量付款到支付宝账户 (链接如有发生变化,请在官方文档中寻找此产品,一般情况下,产品...
一、背景介绍 作为一名Android开发,从最初的跌跌撞撞到现在小有所悟,这其中经历过的辛酸苦辣也是一种痛并快乐着的过程。在这一个过程中,不断的在工作中、在网络上向各位前辈朋友学习,一次一次的充实了自己,学到了新东西,解决了新问题,内心甚是感激。同时在这一过程中,也慢慢积累...
此文档写于2017年3月,只能说明此时该文档适用。使用前请查看以下接口支付宝是否提供。 App支付产品 批量付款到支付宝账户 (链接如有发生变化,请在官方文档中寻找此产品,一般情况下,产品名不会发生改变) 1. App支付产品 通俗上讲就是在App中使用支付宝付款,流程上就...
今天一天奔波在北京,去清华的时候,门口很严格,路上问路的时候碰上好心老奶奶,人家领着我们从小区进入的清华校园,还碰上一个女生给我们引路并告诉我们万人食堂可以用现金。几经波折进入清华校园,跟着导航找到了职业发展中心,校园太大了,腿都走废了,时间本来挺充足,没想到学校太大,食堂...
写这篇文章是要冒风险的,比如说罗胖就被雷锋网花了整版吐槽,而我凭着一点机器学习的皮毛知识,来斗胆谈一下这门技术是如何在App Store和Google Play中被应用的,又如何重塑ASO的。作为推广人,如何拥抱这些变化。非专业出身,有谈的不对的地方,请多包涵! 人工智能最...
2016年6月 有人说,这个季节不适合恋爱,于是大家都寻找着理由分手, 当我处在这个季节时,我也终于明白, 原来,说分手,只是让长痛变成短痛, 而依存的感情才显得弥足珍贵。 那年秋天,我们都还“年轻”,我还是女汉子, 那年秋天,四个女汉子从此碰撞出灿烂的火花。 那年圣诞节,...
亲爱的孩子:
你好!今天是5月25号,也就是说,十四天后你就将迎来至关重要的高考。我特意选在这个特殊的日子给你写下这封信,希望能帮助你做好最后的冲刺,助你实现自己的高考梦想。
我还清楚的记得一个多月前,我给你写下的第一封信。当时的你虽然即将迎来高考,却丝毫没有高考...
01 我不知道,你在老家的村子里,有没有见过这样一个人,他生性怯懦,游手好闲,是别人调侃取笑的对象。 记不记得《夏洛特烦恼》里,夏洛醉醺醺嚷嚷着“谁特么敢笑话我夏洛?”之后,张扬哄着他接了一句“没有,没有人敢笑话夏总”,夏洛这个一事无成的穷光蛋,似乎在一声“夏总”里得到了满...

我要回帖

更多关于 微信扫商家二维码支付 的文章

 

随机推荐