技术饭
活动抽现金红包,微信第三方代发红包
最近需要做一个能抽奖发红包的H5活动,用在微信上,本身微信支付自带了发红包功能,但是奈何开通此功能需要微信支付有1个月以上的支付流水,所以就放弃了,然后采用第三方接口实现红包,第三方接口正常的逻辑是:钱充值到第三方平台,其实钱是冲到了第三方的微信支付账号,然后调用第三方接口,第三就给用户发送红包链接,用户点击就可以领取红包啦。
这里采用的第三方接口是:摇摇啦,这里就不给广告链接了,自行百度,正常流程是:1、注册账号;2、找客服申请接口测试权限;
示例代码:
/**
* [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: [ copylian@aikehou.com ]
* 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;
}
}
代码附件:
文明上网理性发言!