使用PHP实现微信摇一摇周边红包
最近,我参与了一个项目,其中一个核心功能是实现摇一摇红包功能。在网上搜索了很久,始终没有找到合适的源码,于是我决定自己动手编写。在此,我想通过狼蚁网站SEO优化长沙网络推广的平台,分享我的劳动成果,供大家一起学习参考。
微信官方对于摇一摇红包功能有着明确的说明和规定。这个功能主要是为线下商户提供的发红包服务。用户只需在商家门店等线下场所通过摇一摇周边,即可领取商家发放的红包,线上转发分享则无效。
开发者可以通过接口开发摇一摇红包功能,具有以下特点:
1. 可以选择使用模板加载页或自定义Html5页面,调起微信原生红包页面。
2. 用户在原生红包页面可以直接拆红包,无需通过公众号消息下发。
3. 提供关注公众号的能力,用户可以根据自身需求选择是否关注。
4. 完成页面可配置跳转链接,可以跳转到商户的其他自定义Html5页面。
5. 同一个用户在单个红包活动中只能领取一次红包。
关于用户侧交互流程和红包组件接口调用流程,具体如下:
用户侧交互流程:用户在商家门店通过摇一摇周边,即可看到红包活动,点击进入后,可以看到红包列表,选择想要领取的红包,点击拆红包,即可领取。
红包组件接口调用流程:需要申请红包接口权限登录摇一摇周边商户后台,进入开发者支持,申请开通摇一摇红包组件接口。进行红包预下单,调用微信支付的api进行红包预下单,告知需要发放的红包金额、人数,生成红包ticket。接着,创建活动并录入红包信息,调用摇周边平台的api录入创建红包活动并录入信息,传入预下单时生成的红包ticket。然后,在摇出的页面中通过调用jsapi抽红包,抽中红包的用户可以拆红包。调用以上接口时,红包提供商户和红包发放商户公众号需要保持一致。
阐述说明
关于微信红包商户的红包预下单接口传入的参数wxappid所代表的商户,以及红包发放的流程。一个完整的红包活动流程包括创建红包活动、预下单、录入红包信息,并最终发放红包。本文将重点介绍创建红包活动的步骤及接口调用细节。
接口概述
红包活动创建接口是用于设置红包活动的有效期、活动开关等基本信息,成功后将返回活动id。
接口调用详解
服务器端调用细节如下:
HTTP请求方式:POST。
URL:(此处应填写具体的接口URL)。
请求参数说明:
+ `title`:红包活动名称。
+ `desc`:红包活动描述。
+ `onoff`:活动开关状态,1为开启。
+ `begin_time`:活动开始时间(UNIX时间格式)。
+ `expire_time`:活动结束时间(UNIX时间格式)。
+ `sponsor_appid`:赞助商appid。
+ `total`:红包总金额。
+ `jump_url`:跳转URL。
+ `key`:密钥(保证请求的安全性)。
请求示例:
Content-Type: application/json
Post Body:
{
"title": "新春红包大放送",
"desc": "庆祝新春,限时抢红包",
"onoff": 1,
"begin_time": ,
"expire_time": ,
"sponsor_appid": "wx123456789",
"total": 10000,
"jump_url": "
"key": "your_secret_key"
}
返回数据说明:
示例如下:
{
"errcode": 0, //错误代码,成功时返回0。
"errmsg": "", //错误信息描述。
"lottery_id": "x", //返回的活动唯一标识ID。
若`expire_time`活动结束时间未设定,我们的系统将会遇到严重困扰。想象一下,一场精彩的派对没有明确的结束时间,将会是何等的混乱与迷茫。我们必须果断地抛出一个SDK运行时异常,提醒开发者:“活动结束时间 expire_time 尚未设置!”以确保活动的顺利进行。
紧接着,我们检查红包总数的设定。如果没有设定红包总数`total`,那么这就像是在准备一个神秘的礼盒,却不确定里面有多少惊喜。这同样会导致混乱,因此我们需要提醒开发者:“红包总数total缺失,无法为您的幸运用户准备惊喜!”以确保活动的公平与透明。
再来看红包关注跳转连接`jump_url`。如果这一关键链接缺失,用户可能无法顺利参与到活动中来,就像一道门被关闭,我们无法穿越。这时,我们需要向开发者抛出异常:“红包关注跳转连接jump_url尚未设置,您的用户将无法顺利参与活动!”以确保用户的参与体验不受影响。
PHP部分:
创建活动类
创建一个名为`WeChatRedPacket`的类来处理微信红包相关的操作。这个类包含了创建活动、预下单等功能。以下是该类的大致结构:
```php
class WeChatRedPacket {
private $url; // 接口地址
private $token; // 微信token
private $parameters = []; // 参数数组
private $code; // OAuth授权code
private $openid; // 用户OpenID
private $curlTimeout = 30; // curl超时时间
private static $appid; // 应用ID(AppID)
private static $appsecret; // 应用密钥(AppSecret)等公共配置。
public function __construct($token, $url) {
// 初始化方法,设置必要的参数和配置等。
}
public function createActivity() {
// 创建活动的逻辑代码。设置活动参数,通过curl提交到微信服务器。
// 返回处理结果,如果成功则进行后续操作(如存储到数据库)。否则进行错误处理。
}
public function preOrder() {
// 预下单逻辑代码。生成红包信息,通过curl提交到微信服务器进行预下单。返回处理结果并进行相应处理。
}
// 其他辅助方法,如生成OAuth授权URL、获取OpenID等。这些方法会根据实际需求进行实现和优化。
}
```
创建活动逻辑实现(伪代码)
以创建活动逻辑为例,具体的实现可能如下:
```php
public function createActivity() {
try {
// 设置活动参数(如标题、描述、开始时间等)并转换为JSON格式数据。
$this->parameters['title'] = urlencode($title); // 活动标题等参数处理...
当您成功抽得红包后,随之而来的是喜悦与期待。在此过程中也有一点需要您注意的事项。那就是红包的时效性,一旦红包过期失效,相应的资金会自动退回到您的商户财付通账户。这是保障交易公平和透明的重要措施。商户财付通账户为您提供了安全可靠的保障平台,让您的资金流转更为顺畅、透明。您无需担心资金的安全问题,只需关注红包的抽取和后续操作即可。
我们也建议您在享受红包带来的惊喜之余,不忘了解更多的信息。通过我们的平台,您可以了解到更多的优惠活动、商户优惠信息等。这些信息将帮助您更好地掌握市场动态,把握更多的机会。我们也提供了丰富的支付方式和优惠措施,旨在为您提供更好的服务和体验。我们希望您能够充分利用这些资源,享受更多的便利和惊喜。
服务器端接口调用指南
一、HTTP请求方式:POST
二、POST数据格式:XML
三、请求参数详解
请求示例:
```xml
```
四、成功响应说明:当`return_code`和`result_code`均为`SUCCESS`时,返回以下字段。
成功示例:
```xml
```
五、失败响应说明:当`return_code`或`result_code`为`FAIL`时,表示请求失败。具体的错误码和描述会在返回的XML中给出。
失败示例:
```xml
```
我们需要对发放红包接口的参数进行严格检查,确保每一项都是必填的。如果在send_name、total_amount、total_num、wishing、act_name或remark这些关键参数中有任何一个缺失,我们将无法继续执行后续的红包发放操作。这些参数的缺失会触发一个SDKRuntimeException异常,提示信息将清晰地指出缺少哪个参数。
一旦我们确保了所有必填参数都已到位,我们可以继续进行下一步的操作。我们将公众账号ID(wxappid)和商户号(mch_id)这两个重要的信息,从WxPayConf_pub配置类中获取。这两个信息是微信支付的标识,对于红包的发放至关重要。
接下来,我们将生成一个随机字符串nonce_str,用于增加请求的安全性。这个随机字符串是通过createNoncestr方法生成的,每次请求都会生成一个新的随机字符串,确保每次请求的独特性和安全性。
至于用户的openid信息,我们在这一步不进行填写或处理。这个信息通常在用户关注公众号或进行其他操作时获取,我们会将其保存在其他地方,以备后续使用。
我们需要设置红包的类型hb_type。目前我们支持两种红包类型:NORMAL和GROUP。NORMAL类型的红包是普通红包,用户收到后可以直接领取使用;而GROUP类型的红包是裂变红包,用户收到后可以分享给好友,但需要先关注公众号才能领取。在实际应用中,我们可以根据需求和场景选择合适的红包类型进行发放。
红包接口说明
在创建红包活动的过程中,涉及到一系列的接口调用,以确保红包活动的顺利进行。以下是关于这些接口的详细说明。
设置商户信息和参数
你需要设置商户信息以及红包活动的相关参数。在这个过程中,确保正确填写摇周边平台给出的商户ID(auth_mchid)和AppID(auth_appid)。设置风控等级(risk_tl)以及其他必要的参数。生成签名(sign)以验证请求的身份和完整性。
示例代码:
```php
$Redpack = new \Yhb_pub();
$Redpack->setParameter('auth_mchid', '摇周边商户号');
$Redpack->setParameter('auth_appid', '摇周边 appid');
// 设置其他参数...
```
创建红包活动URL
接下来,你需要创建用于获取code的URL和用于获取openid的URL。这些URL将用于后续的红包活动流程。
示例代码:
```php
function createOauthUrlForCode($redirectUrl) {...} // 创建获取code的URL
function createOauthUrlForOpenid() {...} // 创建获取openid的URL
```
通过curl向微信提交code以获取openid
在获取到code之后,你需要通过curl向微信提交code,以获取openid。这个openid将用于标识用户的身份。
示例代码:
```php
function getOpenid() {...} // 通过curl向微信提交code,获取openid
```
设置code
在获取到code之后,需要将其设置到相应的变量中,以备后续使用。
示例代码:
```php
function setCode($code_) {...} // 设置code
```
录入红包信息
在调用创建红包活动的接口之后,需要录入红包信息。这包括设置商户订单号、商户名称、付款金额、红包发放总人数、红包祝福语、活动名称以及备注等信息。然后调用hbpreorder接口进行红包的预处理。
示例代码:
```php
$Redpack->setParameter('mch_billno', ...); // 设置商户订单号等参数
$result = $Redpack->hbpreorder(); // 调用红包预处理接口
```
注意事项
在调用这些接口时,需要注意以下几点:确保填写的商户ID和AppID是正确的;设置参数时要按照规定的格式和要求进行;在提交请求时,要注意超时和错误处理;根据返回的响应结果进行相应的处理。如有疑问或遇到问题,请查阅相关文档或联系微信客服支持。【重磅好消息】红包雨即将倾盆而下,别再犹豫,即刻启动你的抢红包之旅!我们的活动正在热切呼唤,每当你参与我们的红包大战,总有一批全新的红包等你来抢。这不是一场游戏,这是一场充满惊喜和欢乐的盛宴!
你是否厌倦了常规的红包领取方式?是否期待一个全新的红包体验?我们的活动为你带来前所未有的惊喜。这里,红包的发放不再受数量限制,只要你的运气够好,就能抓住每一个红包的机会。但请注意,我们的红包活动有特定的设置,每个活动的红包总量是有限的。
你是否在疑惑,如何参与这场红包大战?答案很简单,只需通过我们的接口进行调用,就能轻松参与。无论红包数量是少于100个还是超过100个,你都可以随时调用接口,添加红包信息。对于小于100个红包的情况,我们建议你一次性添加所有红包信息,以确保不会错过任何一个红包的发放。如果红包数量超过100个,你可以多次调用接口,不必担心错过任何一场抢红包的狂欢。但请记住,每次操作都需要确保录入的红包ticket总数不超过创建该活动时设定的total值。
我们的活动不仅仅是一场简单的红包派发,更是一场充满乐趣和挑战的盛宴。在这里,你可以感受到浓厚的节日氛围,体验到前所未有的刺激和欢乐。无论你是老用户还是新用户,都有机会在这里获得丰厚的奖励。
接口调用说明——服务器端调用
一、HTTP请求方式:POST
二、请求参数说明:
POST BODY:以JSON格式的结构体进行传输。
请求示例:
Content-Type: application/json
Post Body:
```json
{
"lottery_id": "llllll",
"mchid": "10000098",
"sponsor_appid": "wx8888888888888888",
"prize_info_list": [
{
"ticket": "v1|ZiPs2l0hpMBp3uwGI1rwp45vOdz/V/zQ/..."
},
{
"ticket": "v1|fOhNUTap1oepSm5ap0hx1gmATM\/QX\/xn3sZWL..."
}
]
}
```
三、返回数据说明:
示例:
```json
{
"errcode": 0,
"errmsg": "",
"repeat_ticket_list": [
{
"ticket": "v1|ZiPs2l0hpMBp3uwGI1rwp45vOdz..."
},
{
"ticket": "v1|ZiPs2l0zzXCsdfwe45dxCdHiukOdz..."
}
],
"suess_num": 100
}
```
四、接口调用类——lottery_pub:该类继承自Wxpay_client_pub,专门用于处理摇一摇红包、录入红包的相关操作。
变量:$code(code码,用于获取openid)、$openid(用户的openid)。
构造函数:`__construct($aess_token)`,用于设置接口链接和curl超时时间。
若未能提供抽奖活动红包的详细信息列表(prize_info_list),则触发一场SDK运行异常。这确实是一个令人遗憾的遗漏,如同在盛宴上缺少了主角一般,使得整个抽奖活动的精彩程度大打折扣。
在这段代码中,我们遭遇了一种特殊情况。当关键的“prize_info_list”参数为空时,系统无法继续执行后续的抽奖活动流程。这个参数的重要性不言而喻,它就像是整个抽奖活动的灵魂和核心,缺失了它,活动就无法顺利展开。
面对这种情况,我们不得不做出一个决策:抛出一种名为“SDKRuntimeException”的异常。这个异常的目的在于向开发者传达一个明确的信息——系统当前缺少必要的抽奖活动红包信息,无法继续执行后续操作。这并非是一个无法解决的难题,只需要开发者补充完整必要的“prize_info_list”参数,即可轻松避免这种异常。
这样的提示信息也需要以一种亲切、友好的方式呈现给开发者。我们可以以一种更为生动、贴近人性的方式描述这个问题,比如在提示信息中加入一些易于理解的比喻或描述,帮助开发者更好地理解这个问题,并引导他们快速找到解决方案。我们也应该保持一定的专业性,确保提示信息的准确性和权威性。从提供的代码中可以看出,这是一段与微信红包相关的PHP代码。下面是对这段代码的中文解释和点评:
主要功能
1. 生成和发送请求:
生成用于获取code的URL。
使用code获取openid。
创建红包请求并发送。
2. 与微信API交互:
使用curl进行HTTP请求。
从微信API获取数据并处理。
3. 处理红包相关的数据:
设置参数如`lottery_id`和`prize_info_list`。
获取用户信息如`ticket`和`openid`。
4. 生成签名字符串:
为红包请求生成必要的签名。
代码点评
1. 代码风格: 代码使用了较为传统的PHP风格,使用了较多的全局变量和直接操作对象的属性。这种方式在现代PHP开发中可能不太常见,因为它可能会导致代码难以维护和调试。建议使用更加结构化的代码风格,如面向对象编程(OOP)。
2. 错误处理: 代码中没有详细的错误处理机制。例如,如果API请求失败或返回错误的数据格式,代码可能会抛出致命错误或返回不可预测的结果。建议添加适当的错误处理和日志记录机制。
3. 安全性: 代码中的某些部分可能存在安全风险,例如直接将用户提供的参数(如`ticket`)嵌入URL或POST数据中,而不进行任何验证或过滤。这可能导致安全问题,如注入攻击。建议对所有用户输入进行适当的验证和过滤。
4. 代码可读性: 代码中的某些部分可能不易于阅读和理解,特别是在函数和方法的命名上。建议使用更加清晰和描述性的命名方式,以提高代码的可读性。
5. 注释: 代码中没有详细的注释,这对于理解代码的意图和功能可能会产生困难。建议添加适当的注释来解释每个函数和方法的作用以及它们的工作原理。
6. 调用部分: 在调用部分,有些变量(如`getAessToken()`的返回值)没有明确的定义或来源说明,这可能会导致读者困惑。建议明确这些变量的来源和用途。
总结
这段代码主要用于与微信红包相关的操作,包括获取用户信息、设置参数、发送请求等。代码存在一些潜在的问题和改进点,建议进行必要的修改和优化以提高代码的质量和安全性。红包盛宴:你的专属标识与独特机遇
亲爱的用户们:
在此重大的红包活动时刻,我们希望将您的每一个独特标识(OpenID)和珍贵机遇紧密相连,带给您更多无与伦比的惊喜。这不仅仅是一场红包的狂欢,更是一场专为您量身打造的盛宴。
红包活动正式启动
我们为您精心策划了一场盛大的红包活动,每一个活动都承载着我们的诚挚邀请和丰富奖品。活动ID已为您独家定制,代表着您在此活动中的独特身份和尊贵地位。
您的专属红包ticket
您所拥有的红包ticket,是您的特权象征。这张独特的票券,代表着您参与活动的资格和机会。只要您进入红包页面,即可见到为您预留的红包,尽管您可能暂时不选择拆开红包,但您的ticket已经绑定,其他用户无法再绑定此红包。这体现了我们对每位用户的尊重和珍视。
红包金额与绑定时间
每个红包都蕴含着我们的诚意和丰富的金额。无论是小额的惊喜还是大额的礼物,都是我们对您的一份心意。红包的绑定时间请您注意,一旦绑定,该红包即为您所独有,其他用户无法再绑定。若在规定时间内未进行绑定操作,红包将自动退回至商户的财付通账户,敬请留意。
用户与红包的不解之缘
我们深知,用户与红包之间存在着一种不解之缘。您的参与是我们最大的动力,您的喜悦是我们最大的期待。我们努力打造这场红包盛宴,希望为您带来最独特的体验,最惊喜的收获。
让我们共同期待这场红包盛宴,共同见证您的独特魅力和非凡机遇。您的每一个参与,都将成为我们心中的珍贵记忆。让我们共同开启这场红包的狂欢,共享这份喜悦与激情!
微信支付的帮助库与示例XML数据包
我们提供的微信支付帮助库为开发者提供了丰富的功能,其中包括多种类型的接口以满足不同的支付需求。在此,我们将为您展示一个示例XML数据包及其处理流程。
让我们看一下这个简单的XML数据包示例:
```xml
```
接下来,我们的事件处理函数可以如下编写:
```php
// 事件处理函数
function handleEvent($object) {
// 获取事件类型
$eventType = $object->Event;
// 获取菜单事件的key值
$eventKey = $object->EventKey;
if ($eventType == "subscribe" || $eventType == "SCAN") {
if(!empty($object->Ticket)) {
//扫码事件处理逻辑...
} else {
//关注事件处理逻辑...
}
} else if($eventType=="ShakearoundLotteryBind") {
//添加到数据库逻辑...
} else {
//处理其他事件...
}
}
```
我们的“WxPayPubHelper”库集成了所有支付类配置,可供开发者轻松使用。此库包含多种接口类型,如请求型接口和响应型接口。其中,请求型接口主要包括统一支付接口、订单查询接口、退款申请接口等。每个接口都有相应的功能和方法,方便开发者进行调用。
以下是部分核心功能的PHP代码示例:
```php
// Common_util_pub类,包含常用工具函数
class Common_util_pub {
// ... 省略其他方法
// 创建随机字符串方法
public function createNoncestr($length = 32) {
// ...实现逻辑
}
// 格式化参数,签名过程需要使用
function formatBizQueryParaMap($paraMap, $urlencode) {
// ...实现逻辑
}
// 生成签名方法
public function getSign($Obj) {
// ...实现逻辑
}
// 其他常用方法...
}
// Wxpay_client_pub类,请求型接口的基类
class Wxpay_client_pub extends Common_util_pub {
// ... 省略其他方法
// 创建XML方法
function createXml() {
// ...实现逻辑
}
// post请求方法
function postXml() {
// ...实现逻辑
}
// 其他方法...
}
// UnifiedOrder_pub类,统一支付接口类
class UnifiedOrder_pub extends Wxpay_client_pub {
// ... 省略构造函数和其他方法
// 创建接口参数XML方法
function createXml() {
// ...实现逻辑,注意参数验证等步骤
}
}
```
如果参数中的“body”缺失了,那么情况就有些不妙了。这可是统一支付接口不可或缺的一部分啊!没有它,就像一道菜缺少了主菜,让人无法安心。我们必须抛出一个SDKRuntimeException异常,提醒开发者:“喂,这里缺少统一支付接口的核心参数body哦!”
紧接着,如果“total_fee”这个关于总金额的参数也消失不见了,那问题就更为严重了。这个参数就像是一笔交易的血肉之躯,没有它,交易就无法完整。于是,我们再次抛出异常:“喂喂喂,这里也缺少统一支付接口的核心参数total_fee啊!”
再来看看“notify_url”这个通知地址参数。这个参数就像是交易的一个哨岗,用来接收交易状态通知的。如果没有它,交易进程就可能变得云里雾里。缺少这个参数也不行,异常提示得赶紧发出去:“请注意,统一支付接口的通知地址参数notify_url缺失了!”
微信支付订单处理:获取Prepay ID与订单查询
在数字化交易的浪潮中,微信支付成为商家与消费者间的重要桥梁。为了更好地处理支付过程中的订单,我们需要深入理解并高效实现相关的功能,如获取Prepay ID和订单查询。下面,我们将深入这两个功能在PHP中的实现方式。
获取Prepay ID
当我们在处理微信支付订单时,获取Prepay ID是一个关键步骤。它作为预支付交易会话的唯一标识,为我们提供了订单支付状态的确认依据。以下是获取Prepay ID的详细过程:
我们调用`postXml()`方法,该方法负责将我们的参数转换为XML格式并发送到微信支付服务器。在此过程中,我们通过`WxPayConf_pub::APPID`和`WxPayConf_pub::MCHID`获取公众账号ID和商户号。我们设置终端IP、生成随机字符串以及签名等必要参数。之后,我们使用`arrayToXml()`方法将参数数组转化为XML格式的请求体。一旦请求发出,我们捕获可能出现的异常,并通过`getPrepayId()`方法获取返回的prepay_id。这个过程如同舞蹈般精准协调,每一步都至关重要。
订单查询接口
在交易过程中,为了确保订单状态准确无误,我们需要使用订单查询接口来验证订单的支付状态。这一过程依赖于`OrderQuery_pub`类,它继承了`Wxpay_client_pub`类并扩展了特定功能。在构造方法中,我们设置了接口链接和curl超时时间。然后,我们使用`createXml()`方法来生成包含必要参数的XML格式的请求体。这个方法会检查参数是否齐全,如必要参数`out_trade_no`和`transaction_id`至少需要一个。如果参数缺失,将抛出异常。一旦请求成功发送并得到响应,我们就可以通过响应XML来获取订单的详细状态信息。这样,我们就能确保每一笔交易都被准确无误地记录和处理。
微信支付为我们提供了强大的工具来处理订单,从获取Prepay ID到订单查询都是交易流程中不可或缺的一环。只有深入理解并实现这些功能,我们才能确保交易流程的顺畅无阻,为商家和消费者带来更好的体验。以上所述仅为示例代码,实际使用时还需要结合具体环境和业务需求进行调试和优化。
退款申请接口及其XML参数生成
在支付领域,退款申请接口扮演着至关重要的角色。针对这一功能,我们特别推出了一个名为“Refund_pub”的类,它是Wxpay_client_pub类的延伸。让我们深入了解这个类的构造和功能。
一、构造方法
在创建Refund_pub对象时,我们首先设置接口的链接地址为“
二、生成接口参数XML
当我们需要发起退款申请时,createXml方法会帮助我们生成必要的XML参数。这个过程包括以下几个步骤:
1. 参数检测:我们检查是否已填写必要的参数,如订单号(out_trade_no)或交易ID(transaction_id)、退款编号(out_refund_no)、总金额(total_fee)以及退款金额(refund_fee)等。操作员ID(op_user_id)也是必不可少的。这些参数是退款申请的核心信息,缺一不可。
2. 异常处理:如果检测到任何参数缺失,我们会抛出一个SDKRuntimeException异常,并附带相应的错误提示信息。这样,开发者可以迅速定位问题并进行修复。
3. 参数设置:一旦参数完整无误,我们会设置公众账号ID(APPID)、商户号(MCHID)、随机字符串(nonce_str)以及签名(sign)。其中,签名是通过特定的算法生成的,以确保请求的安全性。
4. XML转换:我们将参数转换为XML格式。这是因为微信支付接口通常接受XML格式的请求。通过arrayToXml方法,我们将参数数组转换为符合要求的XML字符串。
在数字化交易的浪潮中,我们的退款查询接口扮演着至关重要的角色。它如同一位贴心的助手,时刻准备回应你的退款查询需求。当我们谈到`RefundQuery_pub`这个类时,首先要了解它是`Wxpay_client_pub`的延伸,专为退款查询而设计。
构造函数的奥秘
当我们实例化这个类时,背后隐藏着一段神秘的初始化过程。接口链接被设定为微信官方的退款查询API地址,仿佛搭建起了一座通往微信支付的桥梁。curl超时时间也被精心设置,确保通信的顺畅无阻。
生成接口参数的XML之旅
接下来是`createXml`方法的舞台。这是一个精心编织的过程,旨在将退款查询的参数转化为XML格式,以便与微信服务器沟通。方法体内,首先检查退款查询参数是否已正确设置。这里的逻辑严谨而细致,确保至少有一个必要参数(out_refund_no、out_trade_no、transaction_id或refund_id)被提供。如果这些参数为空,将抛出异常,提示开发者检查参数设置。这个过程如同一场精密的舞蹈,每一步都至关重要。
获取结果,证书通信
当参数准备就绪后,接下来就是调用`postXmlSSL`方法与微信服务器进行交互。这个过程采用SSL证书通信,确保了数据传输的安全性。当服务器响应后,我们通过`xmlToArray`方法将XML格式的响应转化为数组,便于后续处理。最终,所有的结果都被封装在`$this->result`中返回。这个过程如同一次之旅,充满了未知与惊喜。
退款查询接口是微信支付流程中不可或缺的一环。它承载着商家的期望与用户的信任,确保每一笔交易都能得到妥善处理。在这个类的背后,是开发者们无数的心血与汗水,他们精心编织着每一个细节,确保每一次退款查询都能得到准确、及时的响应。
微信账单下载类:DownloadBill_pub
概述:
该类继承自Wxpay_client_pub,专门用于处理微信支付的账单下载功能。它的核心功能包括生成接口参数XML、获取结果以及对账单接口等。接下来让我们深入了解这些功能的具体实现。
创建XML接口参数:
`createXml()`方法首先检查参数是否齐全,特别是`bill_date`这一关键参数。如果缺少必要参数,它会抛出异常。在确保参数完整后,它会进行一系列操作来构建请求微信支付的XML格式参数。这个过程包括设置公众账号ID、商户号、随机字符串以及签名等。最终,通过`arrayToXml()`方法将参数数组转换成XML格式,准备发起请求。
获取结果:
`getResult()`方法通过SSL证书通信发送XML请求,并获取响应结果。响应结果会被转换成数组格式,存储在类的成员变量中,供后续处理使用。这一过程涉及到与微信的交互,任何网络请求都可能遭遇问题,比如超时或者失败。开发者在使用时需要有相应的错误处理机制。
对账单接口:
在`DownloadBill_pub`类中,对账单接口的实现同样重要。在构造方法中,首先设置了接口链接和curl超时时间。然后,开发者可以根据需要实现其他功能,如根据日期下载对账单等。这个接口为商户提供了一个便捷的方式,用以查询和下载微信支付的交易对账单,有助于商户进行财务核对和审计。
异常处理:
在代码执行过程中,可能会遇到各种问题,如参数缺失、网络问题等。为此,代码中使用了try-catch块来捕获可能的异常。一旦发生异常,程序会捕获它并处理,通常是通过抛出错误信息或者进行日志记录来通知开发者问题所在。这增强了代码的健壮性,使得程序在出现问题时能够优雅地处理,而不是直接崩溃。
`DownloadBill_pub`类为开发者提供了一个简洁、高效的工具,用以与微信支付交互,实现账单的下载和处理功能。其强大的异常处理机制和对参数严格检查的特性,确保了程序的稳定性和安全性。无论是小型商户还是大型企业,都可以利用这个类轻松实现微信支付账单的自动化处理。
```php
class ShortUrl_pub extends Wxpay_client_pub { // 短链接转换类继承自微信支付客户端公共类
public function __construct() { // 构造函数设置接口链接和CURL超时时间
$this->url = " // 设置接口链接
$this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT; // 设置curl超时时间
}
// 创建接口参数XML的函数
public function createXml() {
try {
// 确保所有必要的参数都已设置,主要是检查长链接参数是否存在
if (empty($this->parameters["long_url"])) { // 检查长链接参数是否存在,如果不存在则抛出异常
throw new SDKRuntimeException("短链接转换接口中,缺少必填参数长链接(long_url)!");
}
// 设置其他通用参数,如公众账号ID、商户号等(这些代码未给出,但逻辑类似)
$this->parameters["appid"] = WxPayConf_pub::APPID; // 公众账号ID
$this->parameters["mch_id"] = WxPayConf_pub::MCHID; // 商户号等必要参数设置...(省略)... 签名等(省略)... 生成签名等(省略)... 生成XML格式的数据等(省略)... 返回生成的XML数据等(省略)... (具体的逻辑和代码实现需要您根据实际情况补充完整)
return $this->arrayToXml($this->parameters); // 返回生成的XML格式的请求数据供后续发送请求使用
} catch (SDKRuntimeException $e) { // 异常处理逻辑保持一致,用于处理可能出现的运行时异常并终止程序执行输出错误信息。
响应型接口基类
有一个响应型接口基类叫做`Wxpay_server_pub`,它继承自`Common_util_pub`。这个基类处理与微信支付的交互。它包含一些公共方法和属性,用于处理数据转换、签名验证等任务。
通用通知接口
有一个类叫做`Notify_pub`,它是`Wxpay_server_pub`的扩展。这个类处理与微信支付的通用通知相关的任务。
请求商家获取商品信息接口
另一个类`NativeCall_pub`也继承自`Wxpay_server_pub`。这个类主要负责生成接口参数XML并获取商品ID。当返回代码为“SUCCESS”时,它会设置必要的参数如公众账号ID、商户号等,并生成签名。
静态链接二维码
还有一个类叫做`NativeLink_pub`,它主要负责生成Native支付链接二维码。它有一些方法用于设置参数和创建链接。如果在创建链接时缺少必要的参数,它会抛出一个异常。
以下是关于某个功能的详细解释:
在某个功能中,我们需要获取prepay_id。我们调用`getShortUrl()`方法,该方法会发送一个请求并获取结果中的short_url。这个short_url实际上就是我们要的prepay_id。
在生成接口参数XML的过程中,我们会首先将关联数组转换为XML格式。在这个过程中,我们会设置一些必要的参数如公众账号ID、商户号等,并生成随机字符串和签名。我们将生成的XML数据返回给微信。
在获取商品ID的过程中,我们从接收到的数据中提取出product_id字段并返回。如果在创建支付链接二维码时缺少product_id参数,系统会抛出一个异常提示用户必须填写该参数。
```php
// JSAPI支付——H5网页端调起支付接口
class JsApiPub extends CommonUtilPub {
private $code; // 用于获取openid的code码
private $openid; // 用户的openid
private $parameters; // jsapi参数,格式为json
private $prepayId; // 使用统一支付接口得到的预支付id
private $curlTimeout; // curl超时时间
public function __construct() {
// 设置curl超时时间
$this->curlTimeout = WxPayConfPub::CURL_TIMEOUT;
}
// 生成获取code的URL
public function createOauthUrlForCode($redirectUrl) {
$urlObj = array(
"appid" => WxPayConfPub::APPID,
"redirect_uri" => $redirectUrl,
"response_type" => "code",
"scope" => "snsapi_base",
"state" => "STATEwechat_redirect"
);
$queryString = $this->formatBizQueryParaMap($urlObj, false);
return "
}
// 生成获取openid的URL
public function createOauthUrlForOpenid() {
$urlObj = array(
"appid" => WxPayConfPub::APPID,
"secret" => WxPayConfPub::APPSECRET,
"code" => $this->code,
"grant_type" => "authorization_code"
);
$queryString = $this->formatBizQueryParaMap($urlObj, false);
return "
}
// 通过curl向微信提交code,以获取openid
public function getOpenid() {
$url = $this->createOauthUrlForOpenid();
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
在启动发红包功能时,我们需要仔细检查各项关键参数是否齐全。要确认“nick_name”是否已经填写。如果没有提供这个必填参数,我们的SDK将会引发一个运行时异常,提示信息为:“别忘了填写发红包接口的‘nick_name’哦!”接下来,我们还要验证“send_name”、“total_amount”、“min_value”、“max_value”、“total_num”、“wishing”以及“act_name”等参数是否都已填写完整。如果这些参数中的任何一个缺失,我们的SDK同样会毫不犹豫地抛出一个清晰的异常提示,如:“红包飞翔前,请补充完整的‘total_amount’参数!”每个提示信息的结尾都会以友好的方式提醒用户继续完善信息,确保红包顺利发放。
让我们逐一审视这些参数的重要性。想象一下,如果没有提供发送者的名字(send_name),红包如何找到它的主人?或者没有指定总金额(total_amount),系统如何知道要发放多少红包?红包的金额范围(min_value和max_value)是确保每个人都能得到合理金额的关键。而“total_num”则决定了红包的数量,影响着活动的规模和氛围。“wishing”和“act_name”则赋予了红包更多的情感和活动的背景,让收红包的人感受到更多的温暖和喜悦。“remark”参数则是为整个活动添加一笔个性化的注释,让这次红包雨更加独特和难忘。
如果任何一个参数缺失,我们的SDK将不允许红包的发放,这是为了保障用户体验和活动的顺利进行。请在享受发红包的乐趣前,确保所有的参数都已填写完整哦!让我们一起分享这份喜悦和祝福,让红包飞得更远、更有意义!
红包支付接口类(Groupredpack_pub)扩展自微信客户端支付类(Wxpay_client_pub)。它是为了处理与微信红包相关的操作而设计的。作者为gaoyl101。以下是该类的功能概述及其方法。
类定义与初始化
在构造Groupredpack_pub类时,首先设置了接口链接和cURL超时时间。该类包含两个重要的变量:code和openid,分别用于获取用户身份标识。
生成接口参数XML
在createXml方法中,首先检查是否缺少必要参数(如mch_billno)。确保所有必需参数都已设置后,该方法会生成包含所有必要参数的XML字符串。这些参数包括公众账号ID(wxappid)、商户号(mch_id)、客户端IP(client_ip)、随机字符串(nonce_str)、用户openid等。签名(sign)也会根据这些参数生成。生成的XML字符串将通过cURL进行传输。
发送红包
通过sendRedpack方法,将生成的XML参数发送到微信服务器,并接收响应。响应被转换为数组以便于处理。
创建OAuth URL获取Code和OpenID
createOauthUrlForCode和createOauthUrlForOpenid方法分别用于创建获取code和openid的OAuth URL。这些方法利用微信OAuth 2.0授权来获取用户身份标识。通过向特定URL发送请求,并附带必要的参数(如appid、redirect_uri等),用户将被重定向到微信授权页面,并返回code或openid。
通过Code获取OpenID
getOpenid方法通过之前获取的code向微信服务器发送请求,以获取用户的openid。这涉及到使用cURL库进行HTTP请求,并返回的JSON响应以提取openid。
设置Code
setCode方法允许设置code值,这在获取openid的过程中是必要的。
整体上,这个类是为了与微信红包支付接口进行交互而设计的。它封装了必要的逻辑和参数,以便通过cURL发送请求并处理响应。它还包括错误处理和异常处理机制以确保稳定性和可靠性。此类主要用于处理与微信红包相关的业务逻辑,包括生成红包、发送红包、获取用户身份标识等操作。在开发红包接口的过程中,有时会因为缺少必要的参数而无法继续执行操作。现在,我们将面临一系列的参数验证步骤,确保红包接口的每一个关键参数都已正确填写。让我们深入理解一下这些参数的重要性。
红包的发送者姓名(send_name)是不可或缺的。这个参数标识了红包的发起者,使得接收者在收到红包时能够知道是谁赠送的这份心意。如果没有提供这个参数,我们就无法正确地完成红包的发放操作。如果缺少这个参数,我们将抛出异常:“缺少发红包接口必填参数send_name!”
接下来是红包的总金额(total_amount)。这个参数决定了整个红包的金额大小,是红包发放的核心内容之一。没有它,我们无法确定红包的总价值,也就无法继续后续的发放流程。如果没有提供这个参数,我们会抛出异常:“缺少发红包接口必填参数total_amount!”
除此之外,红包的总数量(total_num)也是非常重要的。这个参数决定了将发放多少个红包,以及每个红包的金额分配情况。没有它,我们无法确定如何分配红包金额,也无法保证每个接收者都能得到应有的奖励。缺少这个参数也会引发异常:“缺少发红包接口必填参数total_num!”
```php
class WxpayClientPub {
//...原有代码保持不变...
//生成用于获取code的URL
function createOauthUrlForCode($redirectUrl) {
$urlParams = array(
"appid" => WxPayConf_pub::APPID,
"redirect_uri" => $redirectUrl,
"response_type" => "code",
"scope" => "snsapi_base",
"state" => "STATEwechat_redirect" // 替换成你的实际状态参数值
);
return " . http_build_query($urlParams); // 使用http_build_query格式化URL参数并构建完整URL
}
//生成用于获取openid的URL
function createOauthUrlForOpenid() {
$urlParams = array(
"appid" => WxPayConf_pub::APPID,
"secret" => WxPayConf_pub::APPSECRET, //注意保密你的应用密钥
"code" => $this->code, //获取code的方式参见其他函数定义或外部传入
在进行发红包接口调用时,必须确保一系列关键参数都已准确填写。若缺少必要的参数,将无法成功发送红包。这些必要参数包括send_name、total_amount、total_num、wishing、act_name以及remark。
我们来逐一检查这些参数是否已正确传入。如果任何一个参数值为空或为null,将抛出一个SDKRuntimeException异常,提示相应的参数缺失信息。这样做的目的是确保我们的红包功能能正常运行,避免出现因参数缺失而导致的错误。
一旦确认所有必要参数都已齐备,接下来我们将进行进一步的设置。公众账号ID和商户号分别被设定为WxPayConf_pub类的APPID和MCHID属性值。这些值对于红包的发送至关重要,确保我们的请求能够被正确识别和处理。
我们还将生成一个随机字符串作为nonce_str参数的值。这个随机字符串的生成对于保证请求的安全性和唯一性非常重要。至于用户openid,我们暂时将其注释掉,可能需要根据实际情况进行进一步的处理或设置。
我们设定hb_type参数的值为'NORMAL',这表示我们发送的是普通红包。如果需要发送裂变红包(一种可分享给好友但无需关注公众号的红包),可以将hb_type的值设定为'GROUP'。
```php
// 设置摇一摇红包活动参数
class addlotteryinfo_pub extends Wxpay_client_pub {
public $code; // 用于获取用户openid的code
public $openid; // 用户的openid
public function __construct($access_token, $logo) {
// 设置接口链接
$this->url = "
// 设置curl超时时间
$this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
}
/
创建接口参数JSON
@throws SDKRuntimeException 如果缺少必要的参数,如抽奖活动名称title
/
public function createJson() {
try {
// 检查是否已设置抽奖活动名称title
if (empty($this->parameters["title"])) {
throw new SDKRuntimeException("请提供抽奖活动名称(title)!");
}
// 设置商户号、appid、风控等参数
$this->parameters["auth_mchid"] = ''; // 摇周边商户号
$this->parameters["auth_appid"] = 'wxbf42bd79c4391863'; // 摇周边 appid
$this->parameters["risk_tl"] = 'NORMAL'; // 风控设置
$this->parameters["sign"] = $this->getSign($this->parameters); // 签名
// 生成可获得code的URL
$redirectUrl = "YOUR_REDIRECT_URL"; // 替换为实际的回调URL
$oauthUrlForCode = $this->createOauthUrlForCode($redirectUrl);
// 通过code获取openid的URL并获取openid
$oauthUrlForOpenid = $this->createOauthUrlForOpenid();
$this->openid = $this->getOpenidFromUrl($oauthUrlForOpenid); // 假设存在此方法实现从URL获取openid的功能
// 将参数转为XML格式并发送请求
return $this->arrayToXml($this->parameters);
} catch (SDKRuntimeException $e) {
// 处理异常,输出错误信息并终止程序执行
die($e->errorMessage());
}
}
// 其他方法...(如createOauthUrlForCode, createOauthUrlForOpenid等)保持不变。
}
```
当创建一个抽奖活动时,提供详尽的参数至关重要。如果缺少了任何关键信息,活动将无法顺利进行。最近,在构建一个新的红包抽奖系统时,我们遇到了一些参数缺失的问题。为了确保活动的顺利进行,我们进行了严格的检查和处理。
我们必须确保活动描述(desc)的完整性。一个清晰、吸引人的描述能够激发用户的参与热情。如果缺少了活动描述,我们立即捕捉到一个异常,抛出一个SDK运行时异常:“遗憾地发现缺少了抽奖活动描述!”我们不会让这种情况发生,因为描述对于活动的成功至关重要。
接着,我们检查活动的开始时间(begin_time)和结束时间(expire_time)。没有明确的日期和时间,活动将无法进行。如果这两个参数缺失,我们会抛出另一个SDK运行时异常:“请注意!缺少活动开始或结束时间!”对于任何活动来说,这都是不可或缺的要素。
红包的总数(total)也是不可或缺的信息。我们必须知道将发放多少个红包,以便进行合理的分配和抽奖机制的设计。如果缺少了这个关键参数,我们会收到这样的提示:“提醒:红包总数未提供!”
红包关注的跳转链接(jump_url)和红包key也是重要的组成部分。这些参数能够帮助我们引导用户参与活动、领取红包并深入了解我们的产品和服务。如果这些参数缺失,我们将捕获异常并提醒用户:“系统中缺少红包跳转链接或红包key,请提供完整信息!”
```php
/
红包活动录入,摇一摇红包功能类
@author jiosen
/
class lottery_pub extends Wxpay_client_pub {
// 用于存储code码,获取用户openid
var $code;
// 存储用户的openid
var $openid;
/
构造函数,初始化对象并设置相关参数
@param string $aess_token 微信接口访问令牌
/
public function __construct($aess_token) {
// 设置接口链接
$this->url = "
// 设置curl超时时间
$this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
}
/
创建接口参数 JSON
@throws SDKRuntimeException 抛出一个运行时异常,用于错误处理
/
public function createJson() {
try {
// 检查是否缺少必要的参数
if(!$this->parameters["lottery_id"]) { //确保参数存在并且非空值检查更合理的方式是 !empty($this->parameters["lottery_id"]) 或者 isset($this->parameters["lottery_id"]) && $this->parameters["lottery_id"] != '' 等方式。这里假设使用严格等于NULL进行异常处理是合适的场景。您可以根据具体情况调整这部分代码。 throw new SDKRuntimeException("抽奖活动id lottery_id缺失!"); //抛出异常,提示缺少抽奖活动id lottery_id的信息。需要补充这个信息才能进行后续操作。"; }
// 对参数进行URL编码处理,确保数据格式正确无误。这里省略了具体实现细节。 注意,如果还有其他必要参数缺失也需要进行相应的检查和处理。 // 构建JSON数据并返回。这里省略了具体实现细节。具体的JSON构建逻辑需要根据您的业务需求来实现。 return json_encode($this->parameters); //返回编码后的JSON字符串。 } catch (SDKRuntimeException $e) { die($e->errorMessage()); //捕获异常并输出错误信息。 } }
}
//... 其他方法省略 ... 省略了其他方法的具体实现细节,保留注释以供参考和理解代码结构。 如果有其他相关需求或者具体方法的实现细节需要详细说明的话,我会根据具体要求进行进一步解答和提供代码示例。 }
}
当检查抽奖活动红包的相关信息列表时,如果意外地发现它竟是空无一物,我的心不由得一紧。这样的情况,仿佛是一场精心准备的盛宴却缺少了主菜,让人失望透顶。我不得不遗憾地抛出一个SDK运行时异常,提示信息中充满了遗憾与无奈:“抽奖活动红包的信息列表prize_info_list缺失了!”
这个错误提示的出现,意味着我们的程序无法继续进行下一步的操作。没有这份重要的信息列表,抽奖活动就如同失去了灵魂,无法展现出它应有的魅力。想象一下,如果一场盛大的派对缺少了嘉宾名单,那将会是何等的尴尬与混乱。这个错误的严重性不容忽视。
在这个时刻,我们需要回顾和检查程序的设置,确保prize_info_list参数已经正确无误地填入。这份信息列表是抽奖活动的核心组成部分,任何遗漏都可能导致活动的无法进行。让我们共同努力,确保这个重要的环节不出差错,让抽奖活动顺利进行,让每一个参与者都能感受到活动的魅力与乐趣。
在这个技术世界里,我们经常会遇到与微信支付的交互问题。为了解决这些问题,我们需要深入了解微信支付的相关操作,如授权商户号、创建请求URL等。接下来,让我们一起这个神秘的领域吧!
让我们关注授权商户号和创建请求的问题。在代码中,我们通过特定的函数来处理这些问题。这些函数的作用是设置请求参数,并通过CURL进行POST请求。为了确保请求能够成功发送并得到响应,我们设置了各种CURL选项,如连接超时时间、返回传输结果等。这样,我们就可以轻松地将请求发送到服务器并得到响应结果。
接下来,我们来谈谈生成获取code的URL和获取openid的URL。这两个URL在获取用户授权和身份验证过程中扮演着重要的角色。通过特定的函数,我们可以轻松地生成这两个URL。这些函数接受必要的参数,如重定向URL、code等,并将其格式化为标准的URL格式。通过这种方式,我们可以轻松地获取用户的授权信息和身份信息。
我们还需要通过curl向微信提交code以获取openid。为了实现这一目的,我们编写了一个特定的函数来处理这个请求。该函数首先生成获取openid的URL,然后使用curl库向该URL发送请求并获取响应结果。我们从响应结果中提取出openid并返回。这样,我们就可以使用用户的openid进行后续的操作了。
为了更轻松地处理这些操作,我们还提供了设置code的函数。通过该函数,我们可以将用户的code保存到程序中,以便后续使用。这样,我们就可以在需要的时候轻松地获取用户的授权信息和身份信息。
这些代码片段为我们提供了与微信支付交互的基本操作。通过阅读和理解这些代码,我们可以更好地了解微信支付的工作原理和交互方式。希望这篇文章能够帮助你更好地理解微信支付的相关操作,并为你提供有用的参考和帮助。希望你在阅读时能够耐心一些,相信你会从中受益匪浅的!关于PHP实现微信摇一摇周边红包功能的介绍就此告一段落,希望能给大家带来启发与帮助。接下来,让我们深入一下这项技术背后的魅力所在。
微信摇一摇周边红包功能作为一种极富创意和吸引力的互动形式,正在受到越来越多用户的青睐。利用PHP语言进行开发实现,无疑为我们的应用增添了一份强大的吸引力。PHP作为一种流行的服务器端编程语言,具有广泛的应用范围和强大的功能特性,非常适合实现这种功能。
微信摇一摇周边红包功能通过利用用户的地理位置信息,为用户带来了一种全新的互动体验。当用户在特定的地理位置范围内摇动手机时,就有机会获得红包奖励。这种功能不仅增加了用户的参与度和粘性,还为企业提供了更多的营销机会。
在实现微信摇一摇周边红包功能时,PHP的强大功能可以帮助我们轻松应对各种挑战。我们可以利用PHP的地理位置服务API来获取用户的地理位置信息,并结合微信的相关API进行交互操作。我们还可以利用PHP的后台处理能力,对红包的发放、领取等进行管理和控制。
我们还可以利用PHP的其他技术特性来增强功能的吸引力。例如,我们可以使用PHP的图形库来生成个性化的红包封面,让用户感受到更多的惊喜和乐趣。我们还可以结合社交媒体平台,将红包分享给更多的用户,扩大影响力。
PHP实现微信摇一摇周边红包功能是一项非常有前景的技术应用。它不仅为用户带来了全新的互动体验,还为企业提供了更多的营销机会。希望能够为大家提供一些有益的参考和帮助。让我们继续PHP技术的无限可能,创造更多有趣、实用的应用!
以上内容纯属个人见解与经验分享,如有不当之处,敬请指正。让我们共同学习进步,为技术世界带来更多的创新与惊喜!微信摇一摇周边红包功能,让我们一起期待更多的精彩!
微信营销
- 使用PHP实现微信摇一摇周边红包
- JS鼠标拖拽实例分析
- js实现无限级树形导航列表效果代码
- ASP漏洞全接触-高级篇
- Mysql优化之Zabbix分区优化
- jQuery实现仿美橙互联两级导航菜单的方法
- Angular2学习笔记——详解NgModule模块
- 用Php编写注册后Email激活验证的实例代码
- 正则表达式的使用 ASP
- 火影忍者动画在线观看
- NodeJS测试框架mocha入门教程
- c罗抵达深圳开启中国行
- 釜底抽薪的釜指的是什么
- 页面滚动值scrollTop在FireFox与Chrome浏览器间的
- php实现往pdf中加数字签名操作示例【附源码下载
- React Native中TabBarIOS的简单使用方法示例