【Delphi】微信支付控件(一)(半小时让您系统拥有支付功能)源代码、帮助文件、演示程序

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?

  1. 公众号AppID的获取,登录微信.公众平台:https://mp.weixin.qq.com/ ,进入</>开发 【基本配置】中可以看到 公众号开发信息。
    在这里插入图片描述
  2. 小程序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 控件方法

以下方法函数简明列表,详细使用说明参见控件 帮助文档

序号方法说明
1StartServer打开微信支付服务,使用支付功能首先需要打开服务
2StopServer关闭微信支付服务
3unifiedorder_JSAPIJSAPI统一下单命令,调用该命令完成JSAPI统一下单。
4orderquery_XML订单查询函数。该函数返回微信支付平台原生的XML字符串。
5Xorderquery_XML订单查询函数。该函数返回微信支付平台原生的XML字符串,需要独立提供 AppID
6refundquery_transaction_id_XML按照微信支付订单号transaction_id查询退单信息,并返回微信平台返回的原生XML信息。
7Xrefundquery_transaction_id_XML按照微信支付订单号transaction_id查询退单信息,并返回微信平台返回的原生XML信息。需要独立提供 AppID
8refundquery_out_trade_no_XML按照商户订单号(out_trade_no)查询退单信息,并返回微信平台返回的原生XML信息。
9Xrefundquery_out_trade_no_XML按照商户订单号(out_trade_no)查询退单信息,并返回微信平台返回的原生XML信息。需要独立提供 AppID
10refundquery_out_refund_no_XML按照商户退单号(out_refund_no)查询退单信息,并返回微信平台返回的原生XML信息。
11Xrefundquery_out_refund_no_XML按照商户退单号(out_refund_no)查询退单信息,并返回微信平台返回的原生XML信息。需要独立提供 AppID
12refundquery_refund_id_XML按照微信平台退单号(refund_id)查询退单信息,并返回微信平台返回的原生XML信息。
13Xrefundquery_refund_id_XML按照微信平台退单号(refund_id)查询退单信息,并返回微信平台返回的原生XML信息。需要独立提供 AppID
14downloadbill_ALL下载交易账单 - 全部。参见:官方文档 ,查询全部账单!
15Xdownloadbill_ALL下载交易账单 - 全部。参见:官方文档 ,查询全部账单!需要独立提供 AppID
16downloadbill_SUCCESS下载交易账单 - 支付成功。参见:官方文档 ,查询交易成功账单!该命令需要双向证书验证。
17Xdownloadbill_SUCCESS下载交易账单 - 支付成功。参见:官方文档 ,查询交易成功账单!该命令需要双向证书验证。需要独立提供 AppID
18downloadbill_REFUND下载交易账单 - 退单。参见:官方文档 ,查询交易退单账单!该命令需要双向证书验证。
19Xdownloadbill_REFUND下载交易账单 - 退单。参见:官方文档 ,查询交易退单账单!该命令需要双向证书验证。需要独立提供 AppID
20downloadbill_RECHARGE_REFUND返回当日充值退款订单!
21Xdownloadbill_RECHARGE_REFUND返回当日充值退款订单!需要独立提供 AppID
22downloadfundflow_Basic下载资金账单 - 基本账户。 参见:官方文档
23Xdownloadfundflow_Basic下载资金账单 - 基本账户。 参见:官方文档,需要独立提供 AppID
24downloadfundflow_Operation下载资金账单 - 运营账户。 参见:官方文档
25Xdownloadfundflow_Operation下载资金账单 - 运营账户。 参见:官方文档,需要独立提供 AppID
26downloadfundflow_Fees下载资金账单 - 手续费账户。 参见:官方文档
27Xdownloadfundflow_Fees下载资金账单 - 手续费账户。 参见:官方文档,需要独立提供 AppID
28batchquerycomment拉取订单评价数据 参见:官方文档
29Xbatchquerycomment拉取订单评价数据 参见:官方文档,需要独立提供 AppID
30PAY_Native_Mode1_QRCodeNative 支付模式一
31XPAY_Native_Mode1_QRCodeNative 支付模式一,需要独立提供 AppID
32PAY_Native_Mode2_URLNative 支付模式二
33XPAY_Native_Mode2_URLNative 支付模式二,需要独立提供 AppID
34Get_Native_URL根据属性Web_Host,Web_Path,Web_UseSSL,Native_Path等, 返回微信支付平台需要设置的Native回调地址。
35Get_Result_URL根据属性Web_Host,Web_Path,Web_UseSSL,Result_Path等, 返回微信支付平台需要设置的Native回调地址。
36PAY_micropay付款码支付,就是用户显示自己的付款码,商户通过扫描枪扫描用户二维码,从而实现支付。
37XPAY_micropay付款码支付,就是用户显示自己的付款码,商户通过扫描枪扫描用户二维码,从而实现支付。需要独立提供 AppID
38PAY_reverse撤销订单,对于付款码支付(micaopay),才支持撤销订单。
39XPAY_reverse撤销订单,对于付款码支付(micaopay),才支持撤销订单。需要独立提供 AppID
40PAY_authcodetoopenid通过付款码查询用户openid,在付款码支付的时候需要使用这个函数,控件内部已经使用,外部无需使用。
41XPAY_authcodetoopenid通过付款码查询用户openid,在付款码支付的时候需要使用这个函数,控件内部已经使用,外部无需使用。需要独立提供 AppID
42Create_QR_File创建链接的QR图片,把一个链接地址转换为二维码图片。二维码图片将位于执行文件目录下的QR_Code目录下。
43Create_QR_Bytes创建链接的QR图片,把一个链接地址转换为二维码图片。返回二维码图片的字节流。
44Get_JSAPI_URL1根据属性Web_Host,Web_Path,Native_Path等, 返回前端需要进行JSAPI支付时的调用地址。参数模式!
45XGet_JSAPI_URL1根据属性Web_Host,Web_Path,Native_Path等, 返回前端需要进行JSAPI支付时的调用地址。参数模式!需要独立提供 AppID
46Get_JSAPI_URL2根据属性Web_Host,Web_Path,Web_UseSSL等, 返回前端需要进行JSAPI支付时的调用地址。路径模式!
47XGet_JSAPI_URL2根据属性Web_Host,Web_Path,Web_UseSSL等, 返回前端需要进行JSAPI支付时的调用地址。路径模式!需要独立提供 AppID
48Get_orderquery_URL返回前端查询订单状态的URL地址
49XGet_orderquery_URL返回前端查询订单状态的URL地址。需要独立提供 AppID
50Get_refund_URL返回前端进行退单需要调用的URL地址
51XGet_refund_URL返回前端进行退单需要调用的URL地址。需要独立提供 AppID
52Get_micropay_URL返回前端进行付款码支付需要调用的URL地址
53XGet_micropay_URL返回前端进行付款码支付需要调用的URL地址。需要独立提供 AppID
54Format_JSON格式化JSON字符串,便于阅读
55Format_XML格式化XML,以便查看。
56writelog书写日志

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;
序号参数方向说明
1AppID支付平台的AppID,告知是小程序还是公众号的AppID,以此可以记录日志
2Merchant_number支付商户号
3openid支付用户相对于平台的openid,知道是哪个用户支付的
4trade_type统一下单的类型:JSAPI 或者 NATIVE,这个事件只触发JSAPI下单
5total_fee订单金额,单位:分
6body订单实体描述,是什么商品等等
7out_Trade_no商户支付订单号,最大不能超过32个字符,在平台中必须唯一,要求在这个事件中完成赋值,如果事件中没有赋值,则使用系统定义的通用商户订单号生成规则
8attach商户附加数据,平台回调的时候会原封不动的送回来,可以为空
9stop统一下单是否停止标志,默认是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; 
序号参数方向说明
1AppID支付平台的AppID,告知是小程序还是公众号的AppID,以此可以记录日志
2Merchant_number支付商户号
3openid支付用户相对于平台的openid,知道是哪个用户支付的
4trade_type统一下单的类型:JSAPI 或者 NATIVE,这个事件只触发JSAPI下单
5total_fee订单金额,单位:分
6body订单实体描述,是什么商品等等
7out_Trade_no商户支付订单号,最大不能超过32个字符,在平台中必须唯一,要求在这个事件中完成赋值,如果事件中没有赋值,则使用系统定义的通用商户订单号生成规则
8err_code统一下单错误码(平台数据)
9err_code_des统一下单错误描述(平台数据)
10prepay_id统一下单返回的预支付码 --------这个参数是重点,系统已经返回给下单者,无需进行处理
11return_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 ***

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海纳老吴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值