步骤一: 如图1,用户通过分享或扫描二维码进入商户小程序,用户选择购买,完成选购流程。
步骤二: 如图3,调起微信支付控件,用户开始输入支付密码。
图1 打开商户小程序图2 要求微信支付图3 调起微信支付控件

步骤三: 如图4,密码验证通过,支付成功。商户后台得到支付成功的关照。
步骤四: 如图5,返回商户小程序,显示购买成功。
步骤五: 如图6,微信支付公众号下发支付凭据。
图4 要求支付成功图5 返回商户小程序图6 下发支付凭据
理解完微信支付不同模式的根本账号关系与利用后,针对第三方模式进行列举解释,以小程序举例。
小程序的开拓:第三方做事商帮商户开拓小程序,有三种业务场景:
第三方自己申请账号,自己开拓,天生指定内页给特约商户用,该模式简称中央化模式。以特约商户身份申请小程序AppID,第三方完成开拓,该模式简称外包模式。通过开放平台第三方开拓者代特约商户进行小程序的开拓,该模式简称第三方模式。无论哪种模式开拓的小程序,在利用面对用户的微信支付能力时,都以该小程序AppID为主体ID来调用微信开放平台供应的API。
以在某小程序中发起微信支付为例,分后台下单和前端js拉起收银台两部分。
个中,后台下单对应微信支付的三大类开放模式,前端js拉起收银台需通过该小程序的AppID,且该AppID参与后台下单。即,根据不同的开放模式和业务场景列举,第三方开拓小程序利用微信支付时,可分为9种[33]不同的组合模式,结合实际业务诉求选择对应的组合模式进行开拓。
把稳
以上[33] 共计9种组合,均能成功接入微信支付。但赤色连接线为二清模式,政策上不许可采取该模式。有需求的第三方开拓者可通过银行渠道商模式接入。
接入前准备更新韶光:2023.08.16
在正式接入微信支付小程序支付做事前,你须要进行以下准备步骤:
选择接入模式:普通商户或普通做事商申请参数:AppID、商户号配置运用:帐号申请商户须要判断自己公司注册区域适用的接入模式和自身实际情形,申请成为普通商户或普通做事商:
普通商户自行申请入驻微信支付,无需做事商帮忙。普通做事商则自身无法作为一个普通商户直接发起交易,其发起交易必须传入干系特约商户商户号的参数信息。详细接入模式先容请参考接入模式文档,并按照参考文档完成相应模式的接入。
请根据自身接入模式分别参考微信支付接入准备-普通商户或微信支付接入准备-普通做事商中的参数申请 - 配置API key - 下载并配置商户证书三个步骤申请接入参数。
申请小程序开拓者账号,进行微信认证,获取AppID登录《微信"大众平台》 (opens new window),注册一个小程序的开拓者账号。小程序账号申请指引(opens new window)小程序开通微信支付,即申请或复用微信支付商户号,申请完小程序后,登录小程序后台 (opens new window)。点击左侧导航栏的微信支付,在页面中进行开通。点击开通按钮后,有2种办法可以获取微信支付能力,新申请微信支付商户号或绑定一个已有的微信支付商户号,请根据你的业务须要和详细情形选择,只能二选一。
开拓指引
为了在担保支付安全的条件下,带给商户大略、同等且易用的开拓体验,我们推出了全新的微信支付APIv3接口。该版本API的详细规则请参考APIv3接口规则。
为了帮助开拓者调用开放接口,我们供应了JAVA、PHP、GO三种措辞版本的开拓库,封装了署名天生、署名验证、敏感信息加/解密、媒体文件上传 等根本功能(更多措辞版本的开拓库将在近期陆续供应)。
测试步骤:
1、根据自身开拓措辞,选择对应的开拓库并构建项目,详细配置请参考下面链接的详细解释:
wechatpay-java (opens new window)(推举)、wechatpay-apache-httpclient (opens new window),适用于Java开拓者。注:当前开拓指引接口JAVA示例代码采取wechatpay-apache-httpclient版本。wechatpay-php (opens new window)(推举)、wechatpay-guzzle-middleware (opens new window),适用于PHP开拓者。注:当前开拓指引接口PHP示例代码采取wechatpay-guzzle-middleware版本。wechatpay-go (opens new window),适用于Go开拓者。更多资源可前往微信支付开拓者社区 (opens new window)搜索查看。
2、创建加载商户私钥、加载平台证书、初始化httpClient的通用方法。
示例代码
javaphp
1@Before2publicvoidsetup()throwsIOException{3//加载商户私钥(privateKey:私钥字符串)4PrivateKeymerchantPrivateKey=PemUtil5.loadPrivateKey(newByteArrayInputStream(privateKey.getBytes("utf-8")));67//加载平台证书(mchId:商户号,mchSerialNo:商户证书序列号,apiV3Key:V3密钥)8AutoUpdateCertificatesVerifierverifier=newAutoUpdateCertificatesVerifier(9newWechatPay2Credentials(mchId,newPrivateKeySigner(mchSerialNo,merchantPrivateKey)),apiV3Key.getBytes("utf-8"));1011//初始化httpClient12httpClient=WechatPayHttpClientBuilder.create()13.withMerchant(mchId,mchSerialNo,merchantPrivateKey)14.withValidator(newWechatPay2Validator(verifier)).build();15}1617@After18publicvoidafter()throwsIOException{19httpClient.close();20}
3、基于接口的示例代码,更换要求参数后可发起测试。
解释:
上面的开拓库为微信支付官方开拓库,其它没有审核或者掌握下的第三方工具和库,微信支付不担保它们的安全性和可靠性。通过包管理工具引入SDK后,可根据下面每个接口的示例代码更换干系参数后进行快速测试。开拓者如果想详细理解署名天生、署名验证、敏感信息加/解密、媒体文件上传等常用方法的详细代码实现,可阅读下面的详细解释:署名天生署名验证敏感信息加解密merchantPrivateKey(私钥)wechatpayCertificates(平台证书)APIV3Key(V3 key)小程序开通微信支付,即申请或复用微信支付商户号,申请完小程序后,登录小程序后台 (opens new window)。点击左侧导航栏的微信支付,在页面中进行开通。(开通申请哀求小程序已发布上线)点击开通按钮后,有2种办法可以获取微信支付能力,新申请微信支付商户号或绑定一个已有的微信支付商户号,请根据你的业务须要和详细情形选择,只能二选一。开通指引(opens new window)小程序访问商户做事都是通过HTTPS,开拓支配的时候须要HTTPS做事器。做事器域名配置。每个微信小程序须要事先设置通信域名,小程序只可以跟指定的域名进行网络通信。包括普通 HTTPS 要求(wx.request)、上传文件(wx.uploadFile)、下载文件(wx.downloadFile)和 WebSocket 通信(wx.connectSocket)从根本库 2.4.0 开始,网络接口许可与局域网 IP 通信,但要把稳 不许可与本机 IP 通信把稳
域名只支持 HTTPS (wx.request、wx.uploadFile、wx.downloadFile)和 wss(wx.connectSocket)协议。域名不能利用 IP 地址(小程序的局域网 IP 除外)或 localhost。可以配置端口,如 https://myserver.com:8080,但是配置后只能向 https://myserver.com:8080/ 发起要求。如果向 https://myserver.com、https://myserver.com:9091 等 URL 要求则会失落败。如果不配置端口。如 https://myserver.com,那么要求的 URL 中也不能包含端口,乃至是默认的 443 端口也不可以。如果向 https://myserver.com:443 要求则会失落败。域名必须经由 ICP 备案。出于安全考虑, API.weixin.qq.com 不能被配置为做事器域名,干系API也不能在小程序内调用。 开拓者应将AppSecret 保存到后台做事器中,通过做事器利用 getAccessToken (opens new window)接口获取 access_token,并调用干系 API。不支持配置父域名,利用子域名。可查阅小程序网络要求 (opens new window)以理解更多信息。重点步骤解释:
步骤4: 用户下单发起支付,商户可通过JSAPI下单创建支付订单。
步骤9: 商户小程序内利用小程序调起支付API(wx.requestPayment)发起微信支付,详见小程序API文档 (opens new window)。
步骤16: 用户支付成功后,商户可吸收到微信支付支付结果关照支付关照API。
步骤21: 商户在没有吸收到微信支付结果关照的情形下须要主动调用查询订单API查询支付结果。
本章节展示了如何利用微信支付做事端 SDK 快速接入小程序支付产品,完成与微信支付对接的部分。
把稳
文档中的代码示例是用来阐述 API 基本利用方法,代码中的示例参数需更换成商户自己账号及要求参数才能跑通。以下接入步骤仅供应参考,请商户结合自身业务需求进行评估、修正。步骤解释:
用户通过商户小程序进入商户网页,当用户选择干系商品购买时,商户系统先调用该接口在微信支付做事后台天生预支付交易单。
示例代码
javaphp
1publicvoidCreateOrder()throwsException{2//要求URL3HttpPosthttpPost=newHttpPost("https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi");45//要求body参数6Stringreqdata="{"7+"\"amount\":{"8+"\"total\":100,"9+"\"currency\":\"CNY\""10+"},"11+"\"mchid\":\"1900006891\","12+"\"description\":\"Image形象店-深圳腾大-QQ公仔\","13+"\"notify_url\":\"https://www.weixin.qq.com/wxpay/pay.php\","14+"\"payer\":{"15+"\"openid\":\"o4GgauE1lgaPsLabrYvqhVg7O8yA\""+"},"16+"\"out_trade_no\":\"1217752501201407033233388881\","17+"\"goods_tag\":\"WXG\","18+"\"appid\":\"wxdace645e0bc2c424\""+"}";19StringEntityentity=newStringEntity(reqdata,"utf-8");20entity.setContentType("application/json");21httpPost.setEntity(entity);22httpPost.setHeader("Accept","application/json");2324//完成署名并实行要求25CloseableHttpResponseresponse=httpClient.execute(httpPost);26try{27intstatusCode=response.getStatusLine().getStatusCode();28if(statusCode==200){29System.out.println("success,returnbody="+EntityUtils.toString(response.getEntity()));30}elseif(statusCode==204){31System.out.println("success");32}else{33System.out.println("failed,respcode="+statusCode+",returnbody="+EntityUtils.toString(response.getEntity()));34thrownewIOException("requestfailed");35}36}finally{37response.close();38httpClient.close();39}40}
主要入参解释:
out_trade_no: 商户系统内部订单号,只能是数字、大小写字母_-且在同一个商户号下唯一。description: 商品描述。notify_url: 支付回调关照URL,该地址必须为直接可访问的URL,不许可携带查询串。total: 订单总金额,单位为分。OpenID: OpenID是微信用户在AppID下的唯一用户标识(AppID不同,则获取到的OpenID就不同),可用于永久标记一个用户。OpenID获取办法请参考以下文档小程序获取OpenID (opens new window)、"大众年夜众号获取OpenID (opens new window)、App获取OpenID (opens new window)。步骤解释: 通过JSAPI下单API成功获取预支付交易会话标识(prepay_id) 后,须要通过JSAPI调起支付API来调起微信支付收银台。
把稳
此API须要将要求参数进行署名(参与署名的参数为:AppID、timeStamp、nonceStr、package,参数区分大小写)。AppID必须为末了拉起收银台的小程序AppID。示例代码
1wx.requestPayment(2{3"timeStamp":"1414561699",4"nonceStr":"5K8264ILTKCH16CQ2502SI8ZNMTM67VS",5"package":"prepay_id=wx201410272009395522657a690389285100",6"signType":"RSA",7"paySign":"oR9d8PuhnIc+YZ8cBHFCwfgpaK9gd7vaRvkYD7rthRAZ\/X+QBhcCYL21N7cHCTUxbQ+EAt6Uy+lwSN22f5YZvI45MLko8Pfso0jm46v5hqcVwrk6uddkGuT+Cdvu4WBqDzaDjnNa5UK3GfE1Wfl2gHxIIY5lLdUgWFts17D4WuolLLkiFZV+JSHMvH7eaLdT9N5GBovBwu5yYKUR7skR8Fu+LozcSqQixnlEZUfyE55feLOQTUYzLmR9pNtPbPsu6WVhbNHMS3Ss2+AehHvz+n64GDmXxbX++IOBvm2olHu3PsOUGRwhudhVf7UcGcunXt8cqNjKNqZLhLw4jq\/xDg==",8"success":function(res){},9"fail":function(res){},10"complete":function(res){}11})
主要入参解释:
package: JSAPI下单接口返回的prepay_id参数值,提交格式如:prepay_id=。signType: 该接口V3版本仅支持RSA。paySign: 署名。paySign生成规则、相应详情及缺点码请拜会 小程序调起支付接口文档。
步骤解释: 当用户完成支付,微信会把干系支付结果将通过异步回调的办法关照商户,商户须要吸收处理,并按文档规范返回应答
把稳
支付结果关照因此POST 方法访问商户设置的关照URL,关照的数据以JSON 格式通过要求主体(BODY)传输。关照的数据包括了加密的支付结果详情。加密不能担保关照要求来自微信。微信会对发送给商户的关照进行署名,并将署名值放在关照的HTTP头Wechatpay-Signature。商户应该验证署名,以确认要求来自微信,而不是其他的第三方。署名验证的算法请参考 《微信支付API v3署名验证》。支付关照HTTP应答码为200或204才会当作正常吸收,当回调处理非常时,应答的HTTP状态码应为500,或者4xx。商户成功吸收到回调关照后应返回成功的HTTP应答码为200或204。同样的关照可能会多次发送给商户系统。商户系统必须能够精确处理重复的关照。 推举的做法是,当商户系统收到关照进行处理时,先检讨对应业务数据的状态,并判断该关照是否已经处理。如果未处理,则再进行处理;如果已处理,则直接返回结果成功。在对业务数据进行状态检讨和处理之前,要采取数据锁进行并发掌握,以避免函数重入造成的数据混乱。对后台通深交互时,如果微信收到商户的应答不符合规范或超时,微信认为关照失落败,微信会通过一定的策略定期重新发起关照,尽可能提高关照的成功率,但微信不担保关照终极能成功。(关照频率为15s/15s/30s/3m/10m/20m/30m/30m/30m/60m/3h/3h/3h/6h/6h - 总计 24h4m)。特殊提醒: 商户系统对付开启结果关照的内容一定要做署名验证,并校验关照的信息是否与商户侧的信息同等,防止数据透露导致涌现“假关照”,造成资金丢失。
更多参数、相应详情及缺点码请拜会 支付结果关照接口文档。
步骤解释: 当商户后台、网络、做事器等涌现非常,商户系统终极未吸收到支付关照时,商户可通过查询订单接口核实订单支付状态。
把稳
查询订单可通过微信支付订单号和商户订单号两种办法查询,两种查询办法返回结果相同。须要调用查询接口的情形:
当商户后台、网络、做事器等涌现非常,商户系统终极未吸收到支付关照。调用支付接口后,返回系统缺点或未深交易状态情形。调用付款码支付API,返回USERPAYING的状态。调用关单或撤销接口API之前,需确认支付状态。示例代码(通过微信订单号查询):
示例代码
javaphp
1publicvoidQueryOrder()throwsException{23//要求URL4URIBuilderuriBuilder=newURIBuilder("https://api.mch.weixin.qq.com/v3/pay/transactions/id/4200000745202011093730578574");5uriBuilder.setParameter("mchid",mchId);67//完成署名并实行要求8HttpGethttpGet=newHttpGet(uriBuilder.build());9httpGet.addHeader("Accept","application/json");10CloseableHttpResponseresponse=httpClient.execute(httpGet);1112try{13intstatusCode=response.getStatusLine().getStatusCode();14if(statusCode==200){15System.out.println("success,returnbody="+EntityUtils.toString(response.getEntity()));16}elseif(statusCode==204){17System.out.println("success");18}else{19System.out.println("failed,respcode="+statusCode+",returnbody="+EntityUtils.toString(response.getEntity()));20thrownewIOException("requestfailed");21}22}finally{23response.close();24}25}
更多参数、相应详情及缺点码请拜会 微信支付订单号/商户订单号接口文档。
步骤解释: 当商户订单支付失落败须要天生新单号重新发起支付,要对原订单号调用关单,避免重复支付;系统下单后,用户支付超时,系统退出不再受理,避免用户连续,请调用关单接口。
把稳
关单没有韶光限定,建议在订单天生后间隔几分钟(最短5分钟)再调用关单接口,避免涌现订单状态同步不及时导致关单失落败。已支付成功的订单不能关闭。示例代码
javaphp
1publicvoidCloseOrder()throwsException{23//要求URL4HttpPosthttpPost=newHttpPost("https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/sdkphp12345678920201028112429/close");5//要求body参数6Stringreqdata="{\"mchid\":\""+mchId+"\"}";78StringEntityentity=newStringEntity(reqdata,"utf-8");9entity.setContentType("application/json");10httpPost.setEntity(entity);11httpPost.setHeader("Accept","application/json");1213//完成署名并实行要求14CloseableHttpResponseresponse=httpClient.execute(httpPost);15try{16intstatusCode=response.getStatusLine().getStatusCode();17if(statusCode==200){18System.out.println("success,returnbody="+EntityUtils.toString(response.getEntity()));19}elseif(statusCode==204){20System.out.println("success");21}else{22System.out.println("failed,respcode="+statusCode+",returnbody="+EntityUtils.toString(response.getEntity()));23thrownewIOException("requestfailed");24}25}finally{26response.close();27}28}
更多参数、相应详情及缺点码请拜会 关闭订单接口文档
步骤解释: 微信支付按天供应交易账单文件,商户可以通过该接口获取账单文件的下载地址。
示例代码
javaphp
1publicvoidTradeBill()throwsException{23//要求URL4URIBuilderuriBuilder=newURIBuilder("https://api.mch.weixin.qq.com/v3/bill/tradebill");5uriBuilder.setParameter("bill_date","2020-11-09");6uriBuilder.setParameter("bill_type","ALL");78//完成署名并实行要求9HttpGethttpGet=newHttpGet(uriBuilder.build());10httpGet.addHeader("Accept","application/json");11CloseableHttpResponseresponse=httpClient.execute(httpGet);1213try{14intstatusCode=response.getStatusLine().getStatusCode();15if(statusCode==200){16System.out.println("success,returnbody="+EntityUtils.toString(response.getEntity()));17}elseif(statusCode==204){18System.out.println("success");19}else{20System.out.println("failed,respcode="+statusCode+",returnbody="+EntityUtils.toString(response.getEntity()));21thrownewIOException("requestfailed");22}23}finally{24response.close();25}26}
更多参数、相应详情及缺点码请拜会 申请交易账单接口文档。
步骤解释: 申请交易账单接口获取到账单下载地址(download_url)后,再通过该接口获取到对应的账单文件,文件内包含交易干系的金额、韶光、营销等信息,供商户核对订单、退款、银行到账等情形。
把稳
账单文件的下载地址的有效韶光为30s。强烈建议商户将实际账单文件的哈希值和之前从接口获取到的哈希值进行比对,以确认数据的完全性。该接口相应的信息要求头中不包含微信接口相应的署名值,因此须要跳过验签的流程。微信在越日9点启动天生前一天的对账单,建议商户10点后再获取。示例代码
1publicvoidDownloadUrl(Stringdownload_url)throwsException{2PrivateKeymerchantPrivateKey=PemUtil.loadPrivateKey(newByteArrayInputStream(privateKey.getBytes("utf-8")));34//初始化httpClient5//该接口无需进行署名验证、通过withValidator((response)->true)实现6httpClient=WechatPayHttpClientBuilder.create().withMerchant(mchId,mchSerialNo,merchantPrivateKey).withValidator((response)->true).build();78//要求URL9//账单文件的下载地址的有效韶光为30s10URIBuilderuriBuilder=newURIBuilder(download_url);11HttpGethttpGet=newHttpGet(uriBuilder.build());12httpGet.addHeader("Accept","application/json");1314//实行要求15CloseableHttpResponseresponse=httpClient.execute(httpGet);16try{17intstatusCode=response.getStatusLine().getStatusCode();18if(statusCode==200){19System.out.println("success,returnbody="+EntityUtils.toString(response.getEntity()));20}elseif(statusCode==204){21System.out.println("success");22}else{23System.out.println("failed,respcode="+statusCode+",returnbody="+EntityUtils.toString(response.getEntity()));24thrownewIOException("requestfailed");25}26}finally{27response.close();28}29}30```3132```php33try{34$resp=$client->request(35'GET',36'https://api.mch.weixin.qq.com/v3/billdownload/file?token=xx',//要求URL37[38'headers'=>['Accept'=>'application/json']39]40);41$statusCode=$resp->getStatusCode();42if($statusCode==200){//处理成功43echo"success,returnbody=".$resp->getBody()->getContents()."\n";44}elseif($statusCode==204){//处理成功,无返回Body45echo"success";46}47}catch(RequestException$e){48//进行缺点处理49echo$e->getMessage()."\n";50if($e->hasResponse()){51echo"failed,respcode=".$e->getResponse()->getStatusCode()."returnbody=".$e->getResponse()->getBody()."\n";52}53return;54}
更多参数、相应详情及缺点码请拜会 下载账单接口文档。
A:在小程序内通过外部H5页面调起支付报错。
A:请按以下几点进行排查:
请检讨要求参数是否精确,如要求参数中的AppID是否与小程序对应。AppID对应的小程序是否有开通小程序支付功能,权限状态是否正常,可登录商户平台核实。AppID与商户号是否存在绑定关系,可登录商户平台核实。A:可通过以下两种办法开通:
绑定已有"大众号的微信支付:耗时10分钟即可,只需原有"大众年夜众号开通微信支付,小程序微信支付可以选择绑定原来的微信支付商户号,即可开通成功。新申请微信支付:耗时须要1-5个事情日,须要提交和申请小程序一样的资料进行审核,审核通过后才能开通成功。API列表功能列表描述小程序下单通过本接口提交微信支付小程序支付订单。小程序调起支付通过小程序下单接口获取到发起支付的必要参数prepay_id,可以按照接口定义中的规则,调起小程序支付。支付关照微信支付通过支付关照接口将用户支付成功关照给商户。微信支付订单号查询订单通过此接口查询订单状态。商户订单号查询订单通过此接口查询订单状态。关闭订单通过此接口关闭待支付订单。退款申请商户可以通过该接口将支付金额退还给买家。查询单笔退款(通过商户退款单号)提交退款申请后,通过调用该接口查询退款状态。退款结果关照微信支付通过退款关照接口将用户退款成功关照给商户。申请资金账单商户可以通过该接口获取资金账单文件的下载地址。申请交易账单商户可以通过该接口获取交易账单文件的下载地址。下载交易/资金账单通过申请交易/资金账单获取到download_url在该接口获取到对应的账单。
以上内容是小程序支付简介和利用操作流程,如有不明白之处可以咨询与我们。