最近需要做一个能抽奖发红包的H5活动,用在微信上,本身微信支付自带了发红包功能,但是奈何开通此功能需要微信
支付入驻满90天并且有1个月以上的交易流水,所以就放弃了,然后采用第三方接口实现红包,第三方接口正常的逻辑
是:钱充值到第三方平台,其实钱是冲到了第三方的微信支付账号,然后调用第三方接口,第三就给用户发送红包链接
,用户点击就可以领取红包啦。
这里采用的第三方接口是:摇摇啦SCRM(技术Wechat:18674509508) 正常流程是:1、注册账号;2、可以找技术申请
接口测试权限;3、正式使用的用户,平台会拉一个微信技术对接群提供技术支持;
示例代码:
/**
* [testhongbao 红包测试]
*/
public function testhongbao() {
//1、获取红包链接
//实例化
$yaoyaola = new \wechat\WechatYaoyaola();
//发送数据
$send_data = [
'title' => '恭喜发财呀呀呀',
'sendname' => '爱客猴信息科技',
'wishing' => '心想事成哈哈哈',
'type' => 0, //类型,0-红包接口,1-企业支付
'money' => 30, //金额单位分,最低30也就是0.3元
'expire' => 60, //过期时间
'orderid' => create_order_sn(1, "xmsw"), //订单编号
'reqtick' => time(), //时间戳
'rurl' => '', //红包领取成功跳转页面
'cburl' => url('notify', '', '', true) //红包领取成功异步通知
];
//返回结果
$result = $yaoyaola->getTicket($send_data);
p($result);
//2、获取订单记录
//实例化
$yaoyaola = new \wechat\WechatYaoyaola();
//发送数据
$send_data = [
'orderid' => 'xmsw00328102516001206',
'ticket' => '4d09c3a12d31a8faab1821547cc20c82'
];
//返回结果
$result = $yaoyaola->getOrderList($send_data);
p($result);
}
基类:
<?php
/**
* Author [ CopyLian ]
* Date: [ 2018.11.10 ]
* Email: [ [email protected] ]
* Site: [ https://www.copylian.com/ ]
* Description: [ 摇摇啦红包接口基类 ]
*/
namespace wechat;
class WechatYaoyaola {
//参数签名密钥
private $apikey = "xxxx";
//客户编号
private $uid = 123456;
//票据生成地址
private $hbticket = 'http://www.yaoyaola.cn/index.php/exapi/hbticket';
//获取红包地址
private $getTicketUrl = 'http://www.yaoyaola.cn/index.php/exapi/gethb/';
//订单查询地址
private $getOrderUlr = 'http://www.yaoyaola.cn/index.php/exapi/checkhb';
/**
* [FunctionName 生成签名]
* @param array $send_data [红包数组]
*/
private function sign($send_data = []) {
//参数验证签名 md5(uid+type+orderid+money+reqtick+apikey),共32字节,字母都为小写
$signstr = $send_data['uid'] . $send_data['type'] . $send_data['orderid'] . $send_data['money']. $send_data['reqtick'] . $this->apikey;
//返回签名
return md5($signstr);
}
/**
* [getOrderList 红包查询接口:若orderid不为空,查询此订单号下所有记录,否则查询指定ticket对应的记录]
* @param array $send_data [红包数组]
$send_data = [
'orderid' => 'xmsw00328102516001206123',
'ticket' => '4d09c3a12d31a8faab1821547cc20c8211'
];
*/
public function getOrderList($send_data = []) {
//客户编号
$send_data['uid'] = $this->uid;
//订单编号
if(!isset($send_data['orderid']) || empty($send_data['orderid'])){
$send_data['orderid'] = '';
}
//票据
if(!isset($send_data['ticket']) || empty($send_data['ticket'])){
$send_data['ticket'] = '';
}
//请求
$result = self::http($this->getOrderUlr, $send_data);
//解析json数据
$result = json_decode($result, true);
//处理返回数据
$rdata = [];
if(isset($result['errcode']) && $result['errcode'] == 0){
//成功返回信息
if(!empty($send_data['orderid'])){
//返回此订单号下所有记录
$rdata = $result['orders'];
} else {
unset($result['errcode']);
$rdata[0] = $result;
}
}
//返回红包领取地址
return $rdata;
}
/**
* [getTicket 获取红包票据]
* @param array $send_data [红包数组]
$send_data = [
'title' => '恭喜发财',
'sendname' => '厦门税务',
'wishing' => '心想事成',
'type' => 0,
'money' => 30,
'expire' => 60,
'orderid' => create_order_sn(1, "xmsw"),
'reqtick' => time(),
];
*/
public function getTicket($send_data = []) {
//客户编号
$send_data['uid'] = $this->uid;
//红包类型,0使用红包接口,1表示使用企业付款接口:如果使用企业付款,金额可以大于200元,企业付款的通知消息只能显示sendname,不能显示活动名称和祝福语
if(!isset($send_data['type']) || !in_array($send_data['type'], [0, 1])){
$send_data['type'] = 0;
}
//红包金额,单位为分,不能低于30
if(!isset($send_data['money']) || empty($send_data['money']) || $send_data['money'] < 30){
$send_data['money'] = 30;
}
//红包超时时间,单位为秒,不指定则默认60秒
if(!isset($send_data['expire']) || empty($send_data['expire'])){
$send_data['expire'] = 60;
}
//自定义订单号,不超过60字节
if(!isset($send_data['orderid']) || empty($send_data['orderid'])){
$send_data['orderid'] = create_order_sn(1, "xmsw");
}
//请求时间戳,单位为秒,与北京标准时间误差不能超过30秒
if(!isset($send_data['reqtick']) || empty($send_data['reqtick'])){
$send_data['reqtick'] = time();
}
//签名
$send_data['sign'] = $this->sign($send_data);
//红包领取结果跳转url,用于给用户显示客户的自定义页面,通过GET方式传送三个参数(以下三行为平台传给rurl的参数),如果rurl为空,则跳转至系统默认结果页面
//ticket: 红包回执
//retmoney: 红包领取金额,单位为分,0为领取失败
//retmsg: 返回信息
if(!isset($send_data['rurl']) || empty($send_data['rurl'])){
$send_data['rurl'] = '';
}
//服务器通知url,参数形式同rurl,用户红包领取成功时回调此url,失败则不回调,由客户方在红包超时后主动查询确认结果。
if(!isset($send_data['cburl']) || empty($send_data['cburl'])){
$send_data['cburl'] = '';
}
//红包标题
if(!isset($send_data['title']) || empty($send_data['title'])){
$send_data['title'] = '恭喜发财';
}
//红包发送方名称
if(!isset($send_data['sendname']) || empty($send_data['sendname'])){
$send_data['sendname'] = '多想互动';
}
//祝福语
if(!isset($send_data['wishing']) || empty($send_data['wishing'])){
$send_data['wishing'] = '心想事成';
}
//请求
$result = self::http($this->hbticket, $send_data);
//解析json数据
$result = json_decode($result, true);
//获取红包地址
$rdata['ticket'] = '';
$rdata['ticketUrl'] = '';
if(isset($result['errcode']) && $result['errcode'] == 0 && isset($result['ticket'])){
//成功获取票据,组装获取红包地址
$rdata['ticketUrl'] = $this->getTicketUrl . $this->uid . "?ticket=" . $result['ticket'];
$rdata['ticket'] = $result['ticket'];
}
//返回红包领取地址
return $rdata;
}
/**
* 发送HTTP请求方法,目前只支持CURL发送请求
* @param string $url 请求URL
* @param array $param GET参数数组
* @param array $data POST的数据,GET请求时该参数无效
* @param string $method 请求方法GET/POST
* @return array 响应数据
*/
protected static function http($url, $param, $data = '', $method = 'GET'){
$opts = array(
CURLOPT_TIMEOUT => 30,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => false,
);
/* 根据请求类型设置特定参数 */
$opts[CURLOPT_URL] = $url . '?' . http_build_query($param);
if(strtoupper($method) == 'POST'){
$opts[CURLOPT_POST] = 1;
$opts[CURLOPT_POSTFIELDS] = $data;
if(is_string($data)){ //发送JSON数据
$opts[CURLOPT_HTTPHEADER] = array(
'Content-Type: application/json; charset=utf-8',
'Content-Length: ' . strlen($data),
);
}
}
/* 初始化并执行curl请求 */
$ch = curl_init();
curl_setopt_array($ch, $opts);
$data = curl_exec($ch);
$error = curl_error($ch);
curl_close($ch);
//发生错误,抛出异常
if($error) throw new \Exception('请求发生错误:' . $error);
return $data;
}
}
文章浏览阅读74次。思路:num%r得到末位r进制数,num/r得到num去掉末位r进制数后的数字。得到的末位r进制数采用头插法插入链表中,更新num的值,循环计算,直到num为0,最后输出链表。//重置,s指针与头指针指向同一处。//更新num的值,至num为0退出循环。//末位r进制数存入s数据域中。//头插法插入链表中(无头结点)//定义头指针为空,s指针。= NULL) //s不为空,输出链表,栈先入后出。
文章浏览阅读176次。武汉芯源半导体积极参与推动中国的大学教育改革以及注重电子行业的人才培养,建立以企业为主体、市场为导向、产学研深度融合的技术创新体系。2023年3月,武汉芯源半导体开发者扶持计划正式开始进行,以打造更为丰富的CW32生态社区。_cw32开发者扶持计划申请
文章浏览阅读5.7k次。2014年底买的一块2TB希捷机械硬盘ST2000DM001-1ER164,用了两年更换了主板、CPU等,后来出现开机不识别的情况,具体表现为:关机后开机,找不到硬盘,就进入BIOS了,只要在BIOS状态下待机半分钟左右再重启,硬盘就会出现。进入系统后,重启(这个过程中主板对硬盘始终处于供电状态),也不会出现不识别硬盘的现象。就好像是硬盘或主板上某个电容坏了一样,刚开始给硬盘通电的N秒钟内电容未能..._st2000dm001不认盘
文章浏览阅读1.5k次。ADO.NET的数据源不单单是DB,也可以是XML、ExcelADO.NET连接数据源有两种交互模式:连接模式和断开模式两个对应的组件:数据提供程序(数据提供者)&DataSetSqlConnectionStringBuilder——连接字符串Connection对象用于开启程序和数据库之间的连接public SqlConnection c..._列举ado.net在操作数据库时,常用的对象及作用
文章浏览阅读113次。【代码】Android 自定义对话框不能铺满全屏。_android dialog宽度不铺满
文章浏览阅读331次。Redis的主从集群与哨兵模式Redis的主从模式全量同步增量同步Redis主从同步策略流程redis主从部署环境哨兵模式原理哨兵模式概述哨兵模式的作用哨兵模式项目部署Redis的主从模式1、Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况。2、为了分担读压力,Redis支持主从复制,保证主数据库的数据内容和从数据库的内容完全一致。3、Redis的主从结构可以采用一主多从或者级联结构,Redis主从复制可以根据是否是全量分为全量同步和增量同步。全量同步Redis全量复制一般发_redis的主从和哨兵集群
文章浏览阅读116次。作者:brightwang原文:https://www.jianshu.com/p/ab9aa8d4df7d最近我遇到了一个bug,我试着通过Rails在以“utf8”编码的MariaDB中保存一个UTF-8字符串,然后出现了一个离奇的错误:Incorrect string value: ‘ð 我用的是UTF-8编码的客户端,服务器也是UTF-8编码的,数据库也是,就连要保存的这个字符串“????..._mysql utf8的作用
文章浏览阅读278次。毕业这么久了,最近闲来准备把毕设过程中的代码整理公开一下,所有代码其实都是网上找的,但都是经过调试能跑通的,希望对需要的人有用。PS:里边很多注释不讲什么意思了,能看懂的自然能看懂。_matlab图像比较
文章浏览阅读73次。思路: screen分为普通和复杂两种,普通的功能大部分是页面跳转以及简单的crud数据,复杂的单独弄出来 跳转普通的screen,直接根据配置文件调整设置<layouts> <loyout screenId="0" bg="bg_start" name="start" defaultWinId="" bgm="" remark=""> ..._libgdx ui 布局
文章浏览阅读3k次,点赞2次,收藏13次。playwright-python 处理Text input和Checkboxs 和 radio buttonsText input输入框输入元素,直接用fill方法即可,支持 ,,[contenteditable] 和<label>这些标签,如下代码:page.fill('#name', 'Peter');# 日期输入page.fill('#date', '2020-02-02')# 时间输入page.fill('#time', '13-15')# 本地日期时间输入p_playwright checkbox
文章浏览阅读596次,点赞5次,收藏6次。这是我看到最最详细的安装说明文章了,必须要给赞!学习了,也配置了,成功的一批!真不知道还有什么可补充的了,在此做个推广,喜欢的小伙伴,走起!_win10 php 安装swoole
文章浏览阅读1k次。今天想实现页面的自适应,本来用的是栅格,但效果不理想,就想起了rem布局。以前使用rem布局,都是在原生html里,还没在框架里使用过,百度没百度出来,就自己琢磨,不知道方法规范不规范,反正成功了,操作如下:1、下载flexible.js2、引入到angular项目里3、根据自己的需要修改细节3.1、在flexible.js里修改每份的像素,3.2、引入cssrem插件,在设置里设..._angular 使用rem