微信公众号发红包活动

先看看效果图:





上图这个效果,可能会有疑问,等等下边会解释为何这样的版面。





可以到自己的零钱里看看,是不是真的领到红包了,答案是肯定的。

为何领取红包的版面不是网上或者官方宣传的那种呢?其实是因为:


官方说的很详细了,首先要关注公众号,并且关注的时间超过50个小时,并且还的允许接收“接收消息”,

官方宣传的样式是防伪消息,两者的区别是这样的,真是一比较就看出差距了:


活动说明:

打开活动介绍界面,下边有个按钮触发抢红包事件,其实是页面跳转,在红包页面自动获取红包,

获取成功后,返回和公众号的聊天窗口就能查到红包消息了,点击消息就可以拆红包了。


首页index.php

获取红包页面:getRedPack.php

类库:

include("WxPay.php");
require_once "jssdk.php";
require_once "interface/common.php";



先上首页index.php:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1, user-scalable=no">
		<title></title>
		<script src="js/jquery-1.7.js" type="text/javascript" charset="utf-8"></script>
		<script type="text/javascript">
			function pageRedrict(){
				$("#divWaiting").show();
				document.location.replace("getRedPack.php");
			}
		</script>
	</head>
	<body style="margin: 0;padding: 0;" onclick="closeWin()">
		<div style="width: 100%;"><img src="img/tc_bg.png" style="width: 100%;" /></div>
		<div onclick="pageRedrict()" style="background-color: #c70202;color: #ffffff;margin-bottom: 50px;
			width: 100px;margin:0 auto;text-align: center;height: 35px;margin-top:20px;line-height: 35px;">抢红包</div>
			<div style="height: 50px;"> </div>
			<div style="position: fixed;top:200px;left: 0;width: 100%;display: none;" id="divWaiting">
				<div style="background: #3e3e3e;width: 200px;height: 60px;text-align: center;margin: 0 auto;color: #ffffff;line-height: 60px;border-radius: 5px;">正在获取红包...</div>
			</div>
			
	</body>
</html>

getRedPack.php

思路:

先通过用户允许获取Code,然后通过Code获取用户OpenID,再按照规定的格式拼接字符串XML,

然后再发送给服务器,接收服务器返回结果,因服务器返回XML格式的字符串,接收要转换为数组,

方便针对成功和失败不同的处理方式。

<?php
	define('APPID', "22222");
	define('MCHID', "33333");
	define('PARTNERKEY', "eeeeeeeee");
	include("WxPay.php");
	require_once "jssdk.php";
	require_once "interface/common.php";
	
	$jssdk = new JSSDK("33333333", "444444444444444");
	$signPackage = $jssdk->GetSignPackage();
	
	$openid;
	
?>
<?php
	if (isset($_GET['code'])){
		$access_token=$jssdk->get_access_token($_GET['code']);
		try{
			$openid=$access_token->openid;
//			echo $openid;
			$token=$access_token->access_token;
			$userinfo=$jssdk->getUserInfo($token,$openid);
			$url= 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'];
			
			getwxPay($openid);
		}
		catch(exception $exp){
			//header("Location:http://www.sqjushi.com/baishi/index.php");
			echo "<script>alert('请重新打开本页面');</script>";
		}
	}else{
		//echo 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'];
		$url=$jssdk->getCode('http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING']);
	}

	function getbillno(){
		$arr=date('Ymd',time());
		for($i=0;$i<10;$i++){
			$arr.=rand(0,9);
		}
		return MCHID."".$arr;
	}
	function getrandNum(){
		return rand(0,99);
	}
	function getwxPay($openid){
		$common=new common();
		$money=100+getrandNum();//单位是分,这样处理的目的是把金额控制在1-2元之间,
		$sender="巨石网络";
		$obj2=array();
		$obj2['mch_billno']="".getbillno();//订单号
		$obj2['mch_id']="".MCHID;
		$obj2['wxappid']="".APPID;
		$obj2['send_name']="宿迁市巨石网络";
		$obj2['re_openid']="".$openid;//发给谁
		$obj2['total_amount']=$money; //金额,单位是分
		$obj2['total_num']=1;//数量,普通红包一次只能给一个用户发送一个红包
		$obj2['wishing']="巨石网络,技术强悍!";
		$obj2['client_ip']="".$common->GetIP();
		$obj2['act_name']="巨石网络红包现行";//这里有坑,好像只能是8个字,或者最多8个字,超过8个字,蛋疼的提示。
		$obj2['remark']="不要自私,记得分享给朋友哦";
		
		//var_dump($obj2);
		
		$url='https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack';
		$wxpayHelper=new WxPay();
		$result=$wxpayHelper->pay($url, $obj2);
		$temp=array();
		$temp=$common->xmlToArray($result);
//		echo "<script>alert('".$temp['return_msg']."');</script>";
		if($temp['return_code']=="SUCCESS"&&$temp['return_msg']=="发放成功"){
			echo "<script>alert('红包已经成功发送,请返回查收!');</script>";
		}
		else{
			echo "<script>alert('".$temp['return_msg']."');</script>";
			echo "<script>document.location.replace('index.php');</script>";
		}
		//echo "<script>alert('".$temp->return_msg."');</script>";
//		var_dump($temp);

	}
?>

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1, user-scalable=no">
		<title></title>
		<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
		<script type="text/javascript">
			//通过config接口注入权限验证配置 
			//, user-scalable=no
			wx.config({
			    //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
			    appId: '333333333', // 必填,公众号的唯一标识
			    timestamp: '<?php echo $signPackage['timestamp'];?>', // 必填,生成签名的时间戳
			    nonceStr: '<?php echo $signPackage['nonceStr'];?>', // 必填,生成签名的随机串
			    signature: '<?php echo $signPackage['signature'];?>',// 必填,签名
			     jsApiList: [  
                  'checkJsApi',  
                  'onMenuShareTimeline',  
                  'hideOptionMenu',  
                  'onMenuShareAppMessage'  
              ] // 必填,需要使用的JS接口列表
			});
			//通过ready接口处理成功验证
			wx.ready(function(){
				// config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后
				function closeWin(){
					wx.closeWindow();
				}
			});
			
		</script>
		
	</head>
	<body >
		
	</body>
</html>

WxPay.php

大伙研究的成果,加班熬夜都不容易,核心代码有偿提供,

可以加QQ【705722325】索取,10块8块也是爱大笑大笑

微信支付,好了告诉我就行了,没有标准价格,纯粹自由支付大笑大笑


jssdk.php

同上。

common.php

<?php
class common {
	public function GetIP() {//获取客户端IP
		if (!empty($_SERVER["HTTP_CLIENT_IP"])) {
			$cip = $_SERVER["HTTP_CLIENT_IP"];
		} elseif (!empty($_SERVER["HTTP_X_FORWARDED_FOR"])) {
			$cip = $_SERVER["HTTP_X_FORWARDED_FOR"];
		} elseif (!empty($_SERVER["REMOTE_ADDR"])) {
			$cip = $_SERVER["REMOTE_ADDR"];
		} else {
			$cip = "无法获取!";
		}
		return $cip;
	}

	public function xmlToArray($xml) {//xml转为数组
		//禁止引用外部xml实体
		libxml_disable_entity_loader(true);
		$xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
		$val = json_decode(json_encode($xmlstring), true);
		return $val;
	}

}

有几个坑需要注意:

坑一、根据官方API你会打开这个网站:http://www.itrus.cn/html/fuwuyuzhichi/436.html

因为按照要求,服务器需要支持https协议,你会发现天威诚信的邮箱服务器已经关机了,邮件根本无法发送。

参照其他步骤做了一遍,也不知道是不是起效果了,暂且认为是有效了吧。

坑二、控制用户领取红包数量

微信支付|商户平台,登陆后,



点击修改,用户领取上限,改为10个,真正领取6个就不行了,提示超限了。















### 微信公众号实现内嵌红包领取功能 为了实现在微信公众号中处理内嵌红包领取的功能,开发者需要遵循特定的流程和接口文档。以下是详细的指南: #### 开发准备 在开始之前,确保已开启微信公众账号的开发模式并获取相应的权限[^1]。 #### 接口调用 对于红包发放与接收的操作,主要依赖于微信支付的相关API。具体来说,可以使用企业付款至零钱接口来完成向用户的转账操作。该过程涉及以下几个方面: - **商户号** 和 **API密钥** 的配置。 - 使用 HTTPS POST 请求方式提交数据给 `https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers` 地址。 - 数据包体采用 XML 格式构建请求参数,包括但不限于金额、订单号等必要字段。 ```xml <xml> <mch_appid><![CDATA[APPID]]></mch_appid> <!-- 商户公众账号 --> <mchid><![CDATA[MCHID]]></mchid> <!-- 商户号 --> <nonce_str><![CDATA[NONCESTR]]></nonce_str><!-- 随机字符串 --> ... </xml> ``` #### 安全校验 每次发起交易都需要进行签名验证以保障安全性。这涉及到MD5算法以及按照字典序拼接所有参与签名的参数名=值对,并附加API密钥作为最后一位成员计算得到最终的sign值[^3]。 #### 用户端展示逻辑 当用户点击领取按钮时,前端页面应触发AJAX轮询机制定期检查服务器返回的状态码判断是否授权成功。一旦确认,则可更新UI显示相应提示信息告知用户已完成领取动作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值