1. 微信支付控件概述
在开发公众号、小程序、网站等过程中,经常需要使用到微信支付,而微信支付又涉及到繁琐的签名加密,验证签名、回调等,需要熟读官方API,特别费神。因此就专门开发了微信支付控件(delphi),使用该控件,以后需要微信支付功能就可以通过简单设置几个参数直接使用,无需再进行繁琐开发(从此不再受那奴役苦)。
控件下载及演示程序请见(需要注册):https://www.abitsoft.com
微信支付控件图标:
微信控件开发语言:delphi
微信控件名称:TWX_PAY_Component
1.1 TWX_PAY_Component 功能
支持同一商户拥有 n个公众号,n个小程序同时支持支付功能,使用一个控件即可完成!
1.支持公众号、小程序、网站等支付;
2.支持属性一次设置即可;
3.支持MD5和HMAC-SHA256签名;
4.支持支付完成结果通知回调响应功能;
5.支持退单回调响应功能;
6.自身包含Web服务功能(支持 HTTPs);
7.支持付款码支付(micropay);
8.支持JSAPI支付(公众号、小程序等);
9.支持Native支付(模式一、模式二);
10.下载交易账单
11.下载资金账单
12.拉取订单评价数据
13.所有微信平台返回和回调都进行了验签,保证是微信平台返回。
1.2 微信支付回调知识
关于微信支付回调,就是说用户支付完成后,微信平台会回调商户平台,通过HTTP协议回调商户平台,这就需要商户平台必须有满足微信平台回调的 Web 地址,如果商户平台没有Web服务器,导致微信平台回调商户失败,无法通知到用户付款结果,此时商户平台需要查询用户的付款结果。
回调就需要商户平台提供Web服务,供微信平台访问回调,这些Web服务器在控件中都已经实现,无需单独建立Web服务器,而且所有实现细节不必关注,自动实现了。
具体的微信回调亲参阅官方文档:微信回调官方文档。
1.3 微信支付几种支付模式的区别
标注红色【已实现】的,表示控件已经完全实现!
本博客将手把手教你实现【付款码支付】、【JSAPI支付】、【Native支付】、【小程序支付】功能。其中【付款码支付】、【Native支付】无需任何编程即可实现,【JSAPI支付】、【小程序支付】自然需要有前端的公众号和小程序配合,控件后端也不需要书写代码,这个在后续博客中会介绍。
2. 控件属性、方法、事件、接口
2.1 控件属性
2.1.1 AppID
微信支付是依赖于公众号、小程序、APP等的,所以需要公众号等平台的AppID。如果是在公众号中支付,则这个AppID表示的是公众号的AppID,如果是在小程序中支付,则这个是对应小程序的AppID,其它类推。
如何获取AppID?
- 公众号AppID的获取,登录微信.公众平台:https://mp.weixin.qq.com/ ,进入</>开发 【基本配置】中可以看到 公众号开发信息。
- 小程序AppID获取,登录微信.公众平台:https://mp.weixin.qq.com/ (使用自己对应的小程序的账号,一般是邮件地址和密码),进入</>开发栏目,在【开发配置】中可以查询到 开发者ID。
2.1.2 API_Key
支付密钥,这个需要在微信商户平台后台获取,支付的时候是需要的,必要参数,该参数应该注意保密!
如何获取到支付密钥(API_KEY)?
登录微信商户平台:https://pay.weixin.qq.com/index.php/core/home/login?return_url=%2F,进入【账户中心】的【API安全】中参看 API 密钥 (只有设置的时候可以看到,以后如果忘记,只能重新设置)
2.1.3 Merchant_Number
支付商户编号,使用微信支付,必须在微信商户平台申请支付,如果申请成功,则微信商户平台会给申请者一个唯一的支付商户号,以后任何微信支付相关命令都需要这个参数。
如何获取商户号(Merchant_Numer)?
以下操作假定已经在微信商户平台申请完成了,我们只需要查询具体的商户号。
1.登录微信商户平台:https://pay.weixin.qq.com/index.php/core/home/login?return_url=%2F
2.在【账户中心】的【个人信息】中可以查询到
2.1.4 SignType_MD5
微信支付中的签名方式:MD5 或者 HMAC_SHA256。True 表示 MD5,否则表示 HMAC_SHA256,该参数默认值:MD5。
2.1.5 Web_Host
web主机域名,按照微信商户平台约定,不能使用IP地址,只能使用域名。不能为空。需要和Web_Host、Web_Path、Web_UseSSL 共同组成 URL 地址。
2.1.6 Web_Path
Web服务器的起始路径,这个参数是必须的。通过这个地址,可以在一个服务器上支持多个支付账号。不能为空。需要和Web_Host、Web_Path、Web_UseSSL 共同组成 URL 地址。
2.1.7 Web_UseSSL
True: 表示使用SSL ,访问时必须使用 HTTPS
False:表示不使用SLL,访问时必须使用HTTP
2.1.8 Native_Path
微信支付中 Native支付需要进行回调,该参数表示的是回调路径,如果使用Native支付,就必须设置这个参数!
需要和Web_Host、Web_Path、Web_UseSSL 共同组成 URL 地址。组成的URL地址必须和微信商户平台上设置的一致。
这个地址应该设置在 微信商户平台 - 【产品中心】 -【 开发配置】 - 【Native 支付】 字段中。否则 Native 支付无法正常回调。
举例说明如下:
假如微信商户平台上的地址是:http://sensor.ABC.com/wxh/Pay/native_notify
那么对应的控件的相关参数如下:
Web_UseSSL :False
Web_Host :sensor.ABC.com
Web_Path :wxh/Pay
本属性应该是 :native_notify
注意属性前后都不包括 /
对于Native 支付,如果不能正确设置回调,用户支付后,商户后台无法知道是否支付成功。
2.1.9 Result_Path
支付完成结果回调地址,支付、退单完成后,微信商户平台会通过这个地址通知结果。需要和Web_Host、Web_Path、Web_UseSSL 共同组成 URL 地址。
举例如下:
Web_UseSSL = ’ False ’
Web_Host = ’ wx.a3650.com ’
Web_Path = ’ WX_PAY ’
Result_Path = ’ Result ’
这最后得到的结果回调地址为:http://wx.a3650.com/WX_PAY/Result
特别提醒:
支付结果通知地址在统一下单的命令中告诉微信商户平台,具体参数是:notify_url
申请退款命令中也存在这个参数:notify_url,本控件已做处理,公用一个 notify_url 即可,也就是本参数Result_Path
2.1.10 UseIndyClient
该参数表示是否使用indy的HTTP客户端和微信后台通信。事实上是不需要使用Indy的客户端的,但是由于delphi 的原生的TNetHTTPClient 的认证事件在主程序是服务(Service)模式下无法使用,这应该是个bug。所以增加了使用Indy客户端的功能。
其中 CertFile 和 KeyFile 都是配合indy客户端使用需要的。
只有在主程序是Service服务模式时才使用 Indy
2.1.11 CertFile
微信支付客户端认证文件,这个文件以及KeyFile文件是微信商户后台发布的,如果申请了微信支付,就可以得到这个文件。
该属性表示了文件在本地的存放位置,是一个包含路径的文件名。
该文件只有在 UseIndyClient 属性为True时才有用,否则可以忽略!
2.1.12 KeyFile
微信支付客户端密钥文件,这个文件以及CertFile文件是微信后台发布的,如果申请了微信支付,就可以得到这个文件。
该属性表示了文件在本地的存放位置,是一个包含路径的文件。
该文件只有在 UseIndyClient 属性为True时才有用,否则可以忽略!
2.1.13 Log
表示是否自动记录日志的属性。逻辑型,默认是True,表示记录日志。关于记录日志的说明:
假如应用程序的名称是:WX_PAY_Demo,在程序中使用的控件名称叫WX_PAY,那么日志将会自动记录在当前目录的log目录下,按照日期记录,文件名称为:WX_PAY_Demo(WX_PAY)]2020-08-19(1).txt。这样保证一个程序中有多个支付控件,日志文件不会交叉。
2.2 控件方法
以下方法函数简明列表,详细使用说明参见控件 帮助文档。
序号 | 方法 | 说明 |
---|---|---|
1 | StartServer | 打开微信支付服务,使用支付功能首先需要打开服务 |
2 | StopServer | 关闭微信支付服务 |
3 | unifiedorder_JSAPI | JSAPI统一下单命令,调用该命令完成JSAPI统一下单。 |
4 | orderquery_XML | 订单查询函数。该函数返回微信支付平台原生的XML字符串。 |
5 | Xorderquery_XML | 订单查询函数。该函数返回微信支付平台原生的XML字符串,需要独立提供 AppID |
6 | refundquery_transaction_id_XML | 按照微信支付订单号transaction_id查询退单信息,并返回微信平台返回的原生XML信息。 |
7 | Xrefundquery_transaction_id_XML | 按照微信支付订单号transaction_id查询退单信息,并返回微信平台返回的原生XML信息。需要独立提供 AppID |
8 | refundquery_out_trade_no_XML | 按照商户订单号(out_trade_no)查询退单信息,并返回微信平台返回的原生XML信息。 |
9 | Xrefundquery_out_trade_no_XML | 按照商户订单号(out_trade_no)查询退单信息,并返回微信平台返回的原生XML信息。需要独立提供 AppID |
10 | refundquery_out_refund_no_XML | 按照商户退单号(out_refund_no)查询退单信息,并返回微信平台返回的原生XML信息。 |
11 | Xrefundquery_out_refund_no_XML | 按照商户退单号(out_refund_no)查询退单信息,并返回微信平台返回的原生XML信息。需要独立提供 AppID |
12 | refundquery_refund_id_XML | 按照微信平台退单号(refund_id)查询退单信息,并返回微信平台返回的原生XML信息。 |
13 | Xrefundquery_refund_id_XML | 按照微信平台退单号(refund_id)查询退单信息,并返回微信平台返回的原生XML信息。需要独立提供 AppID |
14 | downloadbill_ALL | 下载交易账单 - 全部。参见:官方文档 ,查询全部账单! |
15 | Xdownloadbill_ALL | 下载交易账单 - 全部。参见:官方文档 ,查询全部账单!需要独立提供 AppID |
16 | downloadbill_SUCCESS | 下载交易账单 - 支付成功。参见:官方文档 ,查询交易成功账单!该命令需要双向证书验证。 |
17 | Xdownloadbill_SUCCESS | 下载交易账单 - 支付成功。参见:官方文档 ,查询交易成功账单!该命令需要双向证书验证。需要独立提供 AppID |
18 | downloadbill_REFUND | 下载交易账单 - 退单。参见:官方文档 ,查询交易退单账单!该命令需要双向证书验证。 |
19 | Xdownloadbill_REFUND | 下载交易账单 - 退单。参见:官方文档 ,查询交易退单账单!该命令需要双向证书验证。需要独立提供 AppID |
20 | downloadbill_RECHARGE_REFUND | 返回当日充值退款订单! |
21 | Xdownloadbill_RECHARGE_REFUND | 返回当日充值退款订单!需要独立提供 AppID |
22 | downloadfundflow_Basic | 下载资金账单 - 基本账户。 参见:官方文档 |
23 | Xdownloadfundflow_Basic | 下载资金账单 - 基本账户。 参见:官方文档,需要独立提供 AppID |
24 | downloadfundflow_Operation | 下载资金账单 - 运营账户。 参见:官方文档 |
25 | Xdownloadfundflow_Operation | 下载资金账单 - 运营账户。 参见:官方文档,需要独立提供 AppID |
26 | downloadfundflow_Fees | 下载资金账单 - 手续费账户。 参见:官方文档 |
27 | Xdownloadfundflow_Fees | 下载资金账单 - 手续费账户。 参见:官方文档,需要独立提供 AppID |
28 | batchquerycomment | 拉取订单评价数据 参见:官方文档 |
29 | Xbatchquerycomment | 拉取订单评价数据 参见:官方文档,需要独立提供 AppID |
30 | PAY_Native_Mode1_QRCode | Native 支付模式一 |
31 | XPAY_Native_Mode1_QRCode | Native 支付模式一,需要独立提供 AppID |
32 | PAY_Native_Mode2_URL | Native 支付模式二 |
33 | XPAY_Native_Mode2_URL | Native 支付模式二,需要独立提供 AppID |
34 | Get_Native_URL | 根据属性Web_Host,Web_Path,Web_UseSSL,Native_Path等, 返回微信支付平台需要设置的Native回调地址。 |
35 | Get_Result_URL | 根据属性Web_Host,Web_Path,Web_UseSSL,Result_Path等, 返回微信支付平台需要设置的Native回调地址。 |
36 | PAY_micropay | 付款码支付,就是用户显示自己的付款码,商户通过扫描枪扫描用户二维码,从而实现支付。 |
37 | XPAY_micropay | 付款码支付,就是用户显示自己的付款码,商户通过扫描枪扫描用户二维码,从而实现支付。需要独立提供 AppID |
38 | PAY_reverse | 撤销订单,对于付款码支付(micaopay),才支持撤销订单。 |
39 | XPAY_reverse | 撤销订单,对于付款码支付(micaopay),才支持撤销订单。需要独立提供 AppID |
40 | PAY_authcodetoopenid | 通过付款码查询用户openid,在付款码支付的时候需要使用这个函数,控件内部已经使用,外部无需使用。 |
41 | XPAY_authcodetoopenid | 通过付款码查询用户openid,在付款码支付的时候需要使用这个函数,控件内部已经使用,外部无需使用。需要独立提供 AppID |
42 | Create_QR_File | 创建链接的QR图片,把一个链接地址转换为二维码图片。二维码图片将位于执行文件目录下的QR_Code目录下。 |
43 | Create_QR_Bytes | 创建链接的QR图片,把一个链接地址转换为二维码图片。返回二维码图片的字节流。 |
44 | Get_JSAPI_URL1 | 根据属性Web_Host,Web_Path,Native_Path等, 返回前端需要进行JSAPI支付时的调用地址。参数模式! |
45 | XGet_JSAPI_URL1 | 根据属性Web_Host,Web_Path,Native_Path等, 返回前端需要进行JSAPI支付时的调用地址。参数模式!需要独立提供 AppID |
46 | Get_JSAPI_URL2 | 根据属性Web_Host,Web_Path,Web_UseSSL等, 返回前端需要进行JSAPI支付时的调用地址。路径模式! |
47 | XGet_JSAPI_URL2 | 根据属性Web_Host,Web_Path,Web_UseSSL等, 返回前端需要进行JSAPI支付时的调用地址。路径模式!需要独立提供 AppID |
48 | Get_orderquery_URL | 返回前端查询订单状态的URL地址 |
49 | XGet_orderquery_URL | 返回前端查询订单状态的URL地址。需要独立提供 AppID |
50 | Get_refund_URL | 返回前端进行退单需要调用的URL地址 |
51 | XGet_refund_URL | 返回前端进行退单需要调用的URL地址。需要独立提供 AppID |
52 | Get_micropay_URL | 返回前端进行付款码支付需要调用的URL地址 |
53 | XGet_micropay_URL | 返回前端进行付款码支付需要调用的URL地址。需要独立提供 AppID |
54 | Format_JSON | 格式化JSON字符串,便于阅读 |
55 | Format_XML | 格式化XML,以便查看。 |
56 | writelog | 书写日志 |
2.3 控件事件
2.3.1 JSAPI 统一下单前事件:OnPAY_before_unifiedorder
微信支付流程第一步要执行统一下单,执行JSAPI统一下单前会前触发这个事件,在这个事件中可以构造商户订单号,如果商户订单号空,则系统自动生成商户订单号。
TOnPAY_before_unifiedorder = procedure(AppID,Merchant_number,openid,trade_type,total_fee,body : PChar; var out_trade_no,attach : PChar; Stop : Boolean = False) of object;
序号 | 参数 | 方向 | 说明 |
---|---|---|---|
1 | AppID | 入 | 支付平台的AppID,告知是小程序还是公众号的AppID,以此可以记录日志 |
2 | Merchant_number | 入 | 支付商户号 |
3 | openid | 入 | 支付用户相对于平台的openid,知道是哪个用户支付的 |
4 | trade_type | 入 | 统一下单的类型:JSAPI 或者 NATIVE,这个事件只触发JSAPI下单 |
5 | total_fee | 入 | 订单金额,单位:分 |
6 | body | 入 | 订单实体描述,是什么商品等等 |
7 | out_Trade_no | 出 | 商户支付订单号,最大不能超过32个字符,在平台中必须唯一,要求在这个事件中完成赋值,如果事件中没有赋值,则使用系统定义的通用商户订单号生成规则。 |
8 | attach | 出 | 商户附加数据,平台回调的时候会原封不动的送回来,可以为空 |
9 | stop | 出 | 统一下单是否停止标志,默认是False,表示继续完成支付,如果传True表示立即停止 |
通用商户订单号规则(out_trade_no):PAY + YYYY_MM_DD-hhmmss000001( 最后面是6位数字序列号)。
2.3.2 JSAPI 统一下单后事件:OnPAY_after_unifiedorder
JSAPI统一下单完成后触发的事件,此时已经向平台下单完成。在这个事件中可以做一些后续事务处理,比如回写数据库等等。
TOnPAY_after_unifiedorder = procedure(AppID,Merchant_number,openid,trade_type,total_fee,body,out_trade_no,err_code,err_code_des,prepay_id {,code_url} : PChar; return_Result : Boolean) of object;
序号 | 参数 | 方向 | 说明 |
---|---|---|---|
1 | AppID | 入 | 支付平台的AppID,告知是小程序还是公众号的AppID,以此可以记录日志 |
2 | Merchant_number | 入 | 支付商户号 |
3 | openid | 入 | 支付用户相对于平台的openid,知道是哪个用户支付的 |
4 | trade_type | 入 | 统一下单的类型:JSAPI 或者 NATIVE,这个事件只触发JSAPI下单 |
5 | total_fee | 入 | 订单金额,单位:分 |
6 | body | 入 | 订单实体描述,是什么商品等等 |
7 | out_Trade_no | 入 | 商户支付订单号,最大不能超过32个字符,在平台中必须唯一,要求在这个事件中完成赋值,如果事件中没有赋值,则使用系统定义的通用商户订单号生成规则。 |
8 | err_code | 入 | 统一下单错误码(平台数据) |
9 | err_code_des | 入 | 统一下单错误描述(平台数据) |
10 | prepay_id | 入 | 统一下单返回的预支付码 --------这个参数是重点,系统已经返回给下单者,无需进行处理 |
11 | return_Result | 入 | 返回的结果,True 表示统一下单成功,否则表示失败,失败的具体原因查看:err_code 和 err_code_des |
2.3.3 NATIVE 统一下单前事件:OnPAY_before_unifiedorder_NATIVE
用户打开微信扫一扫,扫描商户二维码发起支付,按照支付流程,需要先进行统一下单,在统一下单前会触发这个事件。在这个事件中可以输入商户订单号、调整订单金额(一般不需要调整)等。
TOnPAY_before_unifiedorder_NATIVE = procedure(AppID,Merchant_number,openid,product_id,trade_type : PChar; var out_trade_no,body,total_fee,attach : PChar; var Stop_PAY : Boolean) of object;
2.3.4 NATIVE 统一下单后事件:OnPAY_after_unifiedorder_NATIVE
NATIVE 统一下单后触发这个事件,可以回写数据库等
TOnPAY_after_unifiedorder_NATIVE = procedure(AppID,Merchant_number,openid,trade_type,total_fee,body,out_trade_no,err_code,err_code_des,prepay_id,code_url : PChar; return_Result : Boolean) of object;
2.3.5 micropay 统一下单前事件:OnPAY_before_micropay
micaropay支付,也就是付款码支付,商户扫描手机支付二维码。按照流程也需要统一下单,在统一下单前会触发这个事件。
TOnPAY_before_micropay = procedure(auth_code, body, total_fee : PChar; var out_trade_no, attach : PChar) of object;
2.3.6 micropay 统一下单后事件:OnPAY_after_micropay
付款码支付统一下单后触发这个事件。
TOnPAY_after_micropay = procedure(auth_code,out_trade_no,body,total_fee,attach, openid, transaction_id,time_end,is_subscribe, err_code,err_code_des : PChar) of object;
2.3.7 支付结果通知事件:OnPAY_Result_notify
微信平台支付完成后,会把结果异步告知商家平台,商家平台收到微信支付结果告知后,就会触发这个事件。
TOnPAY_Result_notify = procedure(return_code,return_msg,appid,mch_id,openid,is_subscribe,trade_type,total_fee,cash_fee,transaction_id,out_trade_no,attach,time_end, XMLStr_original_notify : PChar) of object;
PAY_Result_notify_Rec :微信回调信息记录,里边包含支付结果信息
XMLStr_original_notify : 微信平台返回的原始XML数,仅作参考,已经转换成了极了PAY_Result_notify_Rec
在这个事件中可以进行相关的支付流程完善处理。
2.3.8 退款结果通知事件:OnPAY_Refund_notify
出现退款后,微信平台会异步通知商户平台,商户平台收到微信平台的通知会触发这个事件
TOnPAY_Refund_notify = procedure(return_code,return_msg,appid,mch_id,transaction_id,out_trade_no,refund_id,out_refund_no,total_fee,refund_fee,settlement_refund_fee,refund_status,success_time,refund_recv_accout,refund_account,refund_request_source,XMLStr_original_notify : PChar) of object;
2.4 控件 Web 接口
2.4.1 Web JSAPI 统一下单接口
该接口给公众号或者小程序提供统一下单接口,通过该接口公众号和小程序可以快速实现支付。
说明:
前端通过调用地址,发送调用参数
服务端会返回结果JSON参数
前端收到返回结果后可以发起 JSAPI 支付,具体示例代码如下:
function onBridgeReady(){
WeixinJSBridge.invoke(
'getBrandWCPayRequest', {
"appId":"wx2421b1c4370ec43b", //公众号名称,由商户传入
"timeStamp":"1395712654", //时间戳,自1970年以来的秒数
"nonceStr":"e61463f8efa94090b1f366cccfbbb444", //随机串
"package":"prepay_id=u802345jgfjsdfgsdg888",
"signType":"MD5", //微信签名方式:
"paySign":"70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信签名
},
function(res){
if(res.err_msg == "get_brand_wcpay_request:ok" ){
// 使用以上方式判断前端返回,微信团队郑重提示:
//res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
}
});
}
if (typeof WeixinJSBridge == "undefined"){
if( document.addEventListener ){
document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
}else if (document.attachEvent){
document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
}
}else{
onBridgeReady();
}
2.4.2 XWeb JSAPI 统一下单接口
参见 2.4.1 只是调用接口参数中增加了 AppID。
2.4.3 Web 查询订单状态
如果在服务器端查询订单状态,请参见 Get_orderquery_State 方法。为了前端操作方便,该命令提供前端调用接口。
接口调用地址:PAY_orderquery
接口调用参数(JSON):
{
“out_trade_no”:“TT2100”
}
返回结果成功:
{
“status”:“0”
}
返回的是一个结果码,含义如下:
tsSUCCESS = 0,
tsREFUND = 1,
tsNOTPAY = 2,
tsCLOSED = 3,
tsREVOKED = 4,
tsUSERPAYING = 5,
tsPAYERROR = 6,
tsSYSTEMERROR = 7
实际的调用地址可以通过函数:Get_orderquery_URL 获取到。
2.4.4 XWeb 查询订单状态
参见 2.4.3 调用参数增加 AppID。
2.4.5 Web 付款码支付
如果在服务器端操作付款码支付,请参见 PAY_micropay 方法。为了前端操作方便,该命令提供前端调用接口。
接口调用地址:PAY_micropay
接口调用参数(JSON):
{
“auth_code”:“T100”,
“out_trade_no”:“TT2100”,
“body”:“2”,
“total_fee”:“2”,
“attach”:“附加信息”
}
返回结果成功:
{
“openid”:“To00281093098”,
“transaction_id”:“u1028088809”,
“time_end”:“2020-08-09 12:30:00”,
“is_subscribe”:“Y”
}
返回结果失败:
{
“errcode”:“FAIL”,
“errmsg”:“参数不能为空”
}
实际的调用地址可以通过函数:Get_micropay_URL 获取到。
2.4.6 XWeb 付款码支付
参见 2.4.5 增加参数 AppID。
2.4.7 Web 退单命令
如果在服务器端操作退单,请参见 refund 方法。为了前端操作方便,给前端提供了退单的API退单接口。
接口调用地址:PAY_refund
接口调用参数(JSON):
{
“out_trade_no”:“T100”,
“out_refund_no”:“TT2100”,
“total_fee”:“2”,
“refund_fee”:“2”
}
返回结果成功:
{
“refund_id”:“To00281093098”
}
4. 返回结果失败:
{
“errcode”:“FAIL”,
“errmsg”:“参数不能为空”
}
实际的调用地址可以通过函数:Get_refund_URL 获取到。
2.4.8 XWeb 退单命令
参见 2.4.7 增加参数 AppID。
如有任何问题请加微信:
***未完,请看下一篇… 有建议请QQ:910731685 ***