最近需要做一个能抽奖发红包的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;
}
}
文章浏览阅读1.6k次。安装配置gi、安装数据库软件、dbca建库见下:http://blog.csdn.net/kadwf123/article/details/784299611、检查集群节点及状态:[root@rac2 ~]# olsnodes -srac1 Activerac2 Activerac3 Activerac4 Active[root@rac2 ~]_12c查看crs状态
文章浏览阅读1.3w次,点赞45次,收藏99次。我个人用的是anaconda3的一个python集成环境,自带jupyter notebook,但在我打开jupyter notebook界面后,却找不到对应的虚拟环境,原来是jupyter notebook只是通用于下载anaconda时自带的环境,其他环境要想使用必须手动下载一些库:1.首先进入到自己创建的虚拟环境(pytorch是虚拟环境的名字)activate pytorch2.在该环境下下载这个库conda install ipykernelconda install nb__jupyter没有pytorch环境
文章浏览阅读5.2k次,点赞19次,收藏28次。选择scoop纯属意外,也是无奈,因为电脑用户被锁了管理员权限,所有exe安装程序都无法安装,只可以用绿色软件,最后被我发现scoop,省去了到处下载XXX绿色版的烦恼,当然scoop里需要管理员权限的软件也跟我无缘了(譬如everything)。推荐添加dorado这个bucket镜像,里面很多中文软件,但是部分国外的软件下载地址在github,可能无法下载。以上两个是官方bucket的国内镜像,所有软件建议优先从这里下载。上面可以看到很多bucket以及软件数。如果官网登陆不了可以试一下以下方式。_scoop-cn
文章浏览阅读4.5k次,点赞2次,收藏3次。首先要有一个color-picker组件 <el-color-picker v-model="headcolor"></el-color-picker>在data里面data() { return {headcolor: ’ #278add ’ //这里可以选择一个默认的颜色} }然后在你想要改变颜色的地方用v-bind绑定就好了,例如:这里的:sty..._vue el-color-picker
文章浏览阅读640次。基于芯片日益增长的问题,所以内核开发者们引入了新的方法,就是在内核中只保留函数,而数据则不包含,由用户(应用程序员)自己把数据按照规定的格式编写,并放在约定的地方,为了不占用过多的内存,还要求数据以根精简的方式编写。boot启动时,传参给内核,告诉内核设备树文件和kernel的位置,内核启动时根据地址去找到设备树文件,再利用专用的编译器去反编译dtb文件,将dtb还原成数据结构,以供驱动的函数去调用。firmware是三星的一个固件的设备信息,因为找不到固件,所以内核启动不成功。_exynos 4412 刷机
文章浏览阅读2w次,点赞24次,收藏42次。Linux系统配置jdkLinux学习教程,Linux入门教程(超详细)_linux配置jdk
文章浏览阅读3.3k次,点赞5次,收藏19次。xlabel('\delta');ylabel('AUC');具体符号的对照表参照下图:_matlab微米怎么输入
文章浏览阅读119次。顺序读写指的是按照文件中数据的顺序进行读取或写入。对于文本文件,可以使用fgets、fputs、fscanf、fprintf等函数进行顺序读写。在C语言中,对文件的操作通常涉及文件的打开、读写以及关闭。文件的打开使用fopen函数,而关闭则使用fclose函数。在C语言中,可以使用fread和fwrite函数进行二进制读写。 Biaoge 于2024-03-09 23:51发布 阅读量:7 ️文章类型:【 C语言程序设计 】在C语言中,用于打开文件的函数是____,用于关闭文件的函数是____。
文章浏览阅读3.4k次,点赞2次,收藏13次。跟随鼠标移动的粒子以grid(SOP)为partical(SOP)的资源模板,调整后连接【Geo组合+point spirit(MAT)】,在连接【feedback组合】适当调整。影响粒子动态的节点【metaball(SOP)+force(SOP)】添加mouse in(CHOP)鼠标位置到metaball的坐标,实现鼠标影响。..._touchdesigner怎么让一个模型跟着鼠标移动
文章浏览阅读178次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:Springboot + mybatis + Maven +mysql5.7或8.0+html+css+js等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。_基于java技术的停车场管理系统实现与设计
文章浏览阅读3.5k次。前言对于MediaPlayer播放器的源码分析内容相对来说比较多,会从Java-&amp;gt;Jni-&amp;gt;C/C++慢慢分析,后面会慢慢更新。另外,博客只作为自己学习记录的一种方式,对于其他的不过多的评论。MediaPlayerDemopublic class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal..._android多媒体播放源码分析 时序图
文章浏览阅读2.4k次,点赞41次,收藏13次。java 数据结构与算法 ——快速排序法_快速排序法