PHP微信公众号开发之微信红包实现方法分析


Posted in PHP onJuly 14, 2017

本文实例讲述了PHP微信公众号开发之微信红包实现方法。分享给大家供大家参考,具体如下:

这几天遇到了一个客户 要给他们的微信公众平台上添加微信现金红包功能,是个二次开发的功能,顺手百度一下,原来不复杂。就着手开发功能了。现将开发的过程和需求贴出来分享一下:

一.需求:

粉丝通过在客户的公众平台点击他们公司的订单,然后给这个订单返现五元,发到订单的这个微信号上。

二.开发想法:

1:先拿到关注这个粉丝的openid,openid是关注某个公众号的微信标识,这样就可以定位到这个人是订单的操作者了。

2:发送xml数据请求微信服务器。

代码有两个php文件

1.oauth2.php

<?php
$code=$_GET['code'];
$state=$_GET['state'];
$appid='XXXX';
$appsecret='XXXXXXXX';//
if (empty($code)) $this->error('授权失败');
$token_url='https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$appid'&secret='.$appsecret.'&code='.$code.'&grant_type=authorization_code';
$token=json_decode(file_get_contents($token_url));
if (isset($token->errcode)) {
echo '<h1>错误1</h1>'.$token->errcode;
echo '<br/><h2>错误信息1:</h2>'.$token->errmsg;
exit;
}
session_start();
$_SESSION['openid']= $token->openid;
header('location:http://www.XXXXXXX.com/XXXXX/XXXXXX/XXXXXX/hongbao.php');//要跳转的文件路径
?>

2.hongbao.php

<?php
//XXXXX。。是需要开发者自己填写的内容,注意不要泄密
 // 从session中获取到openid;
$openid=$_SESSION["openid"];
    if(empty($openid))
    {
header('location:https://open.weixin.qq.com/connect/oauth2/authorize?appid=XXXXXXXX&redirect_uri=http://www.XXXXXXX.com/oauth2.php&respose_type=code&scope=snsapi_base&state=XXXX&connect_redirect=1#wechat_redirect');
    }
}
// 关键的函数
public function weixin_red_packet(){
  // 请求参数
  // 随机字符串
  $data['nonce_str']=$this->get_unique_value();
  //商户号,输入你的商户号
  $data['mch_id']="XXXXXXX";
  //商户订单号,可以按要求自己组合28位的商户订单号
  $data['mch_billno']=$data['mch_id'].date("ymd")."XXXXXX".rand(1000,9999);
  //公众帐号appid,输入自己的公众号appid
  $data['wxappid']="XXXXXXX";
  //商户名称
  $data['send_name']="XXXXX";
  //用户openid,输入待发红包的用户openid
  session_start();
  $data['re_openid']=$_SESSION["openid"];
  //付款金额
  $data['total_amount']="XXXX";
  //红包发放总人数
  $data['total_num']="XXXX";
  //红包祝福语
  $data['wishing']="XXXX";
  //IP地址
  $data['client_ip']=$_SERVER['LOCAL_ADDR'];
  //活动名称
  $data['act_name']="XXXXX";
  //备注
  $data['remark']="XXXXX";
  // 生成签名
  //对数据数组进行处理
  //API密钥,输入自己的K 微信商户号里面的K
  $appsecret="XXXXXXXXXXXXXX"; //
  $data=array_filter($data);
  ksort($data);
  $str="";
  foreach($data as $k=>$v){
    $str.=$k."=".$v."&";
  }
  $str.="key=".$appsecret;
  $data['sign']=strtoupper(MD5($str));
  /*
    发红包操作过程:
      1.将请求数据转换成xml
      2.发送请求
      3.将请求结果转换为数组
      4.将请求信息和请求结果录入到数据库中
      4.判断是否通信成功
      5.判断是否转账成功
   */
  //发红包接口地址
  $url="https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack";
  //将请求数据由数组转换成xml
  $xml=$this->arraytoxml($data);
  //进行请求操作
  $res=$this->curl($xml,$url);
  //将请求结果由xml转换成数组
  $arr=$this->xmltoarray($res);
}
// 生成32位唯一随机字符串
private function get_unique_value(){
  $str=uniqid(mt_rand(),1);
  $str=sha1($str);
  return md5($str);
}
// 将数组转换成xml
private function arraytoxml($arr){
  $xml="<xml>";
  foreach($arr as $k=>$v){
    $xml.="<".$k.">".$v."</".$k.">";
  }
  $xml.="</xml>";
  return $xml;
}
// 将xml转换成数组
private function xmltoarray($xml){
  //禁止引用外部xml实体
  libxml_disable_entity_loader(true);
  $xmlstring=simplexml_load_string($xml,"SimpleXMLElement",LIBXML_NOCDATA);
  $arr=json_decode(json_encode($xmlstring),true);
  return $arr;
}
//进行curl操作
private function curl($param="",$url) {
  $postUrl = $url;
  $curlPost = $param;
  //初始化curl
  $ch = curl_init();
  //抓取指定网页
  curl_setopt($ch, CURLOPT_URL,$postUrl);
  //设置header
  curl_setopt($ch, CURLOPT_HEADER, 0);
  //要求结果为字符串且输出到屏幕上
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  //post提交方式
  curl_setopt($ch, CURLOPT_POST, 1);
  // 增加 HTTP Header(头)里的字段
  curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);
  // 终止从服务端进行验证
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
  //证书放到网站根目录的cert文件夹底下
  curl_setopt($ch,CURLOPT_SSLCERT,dirname(__FILE__).DIRECTORY_SEPARATOR.
        'cert'.DIRECTORY_SEPARATOR.'apiclient_cert.pem');
    curl_setopt($ch,CURLOPT_SSLKEY,dirname(__FILE__).DIRECTORY_SEPARATOR.
        'cert'.DIRECTORY_SEPARATOR.'apiient_key.pem');
    curl_setopt($ch,CURLOPT_CAINFO,dirname(__FILE__).DIRECTORY_SEPARATOR.
        'cert'.DIRECTORY_SEPARATOR.'rootca.pem');
  //运行curl
  $data = curl_exec($ch);
  //关闭curl
  curl_close($ch);
  return $data;
}
?>

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
require(),include(),require_once()和include_once()的异同
Jan 02 PHP
收集的二十一个实用便利的PHP函数代码
Apr 22 PHP
无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装最快的解决办法
Aug 01 PHP
php中用于检测一个地理IP地址是否可用的代码
Feb 19 PHP
php中数组首字符过滤功能代码
Jul 31 PHP
深入HTTP响应状态码速查表的详解
Jun 07 PHP
有关于PHP中常见数据类型的汇总分享
Jan 06 PHP
ThinkPHP中自定义错误页面和提示页面实例
Nov 22 PHP
php可生成缩略图的文件上传类实例
Dec 17 PHP
Yii隐藏URL中index.php的方法
Jul 12 PHP
thinkPHP实现的联动菜单功能详解
May 05 PHP
PHP连接SQL Server的方法分析【基于thinkPHP5.1框架】
May 06 PHP
PHP机器学习库php-ml的简单测试和使用方法
Jul 14 #PHP
thinkphp3.2嵌入百度编辑器ueditor的实例代码
Jul 13 #PHP
PHP微信PC二维码登陆的实现思路
Jul 13 #PHP
PHP基于socket实现客户端和服务端通讯功能
Jul 13 #PHP
php中请求url的五种方法总结
Jul 13 #PHP
Laravel 5.4重新登录实现跳转到登录前页面的原理和方法
Jul 13 #PHP
php获取'/'传参的值简单方法
Jul 13 #PHP
You might like
Discuz板块横排显示图片的实现方法
2007/05/28 PHP
完美解决令人抓狂的zend studio 7代码提示(content Assist)速度慢的问题
2013/06/20 PHP
ThinkPHP进程计数类Process用法实例详解
2015/09/25 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
2017/08/28 PHP
PHP实现动态压缩js与css文件的方法
2018/05/02 PHP
PHP读取文件,解决中文乱码UTF-8的方法分析
2020/01/22 PHP
swoole锁的机制代码实例讲解
2021/03/04 PHP
js最简单的拖拽效果实现代码
2010/09/24 Javascript
jQuery setTimeout()函数使用方法
2013/04/07 Javascript
jquery选择器使用详解
2014/04/08 Javascript
jQuery ui autocomplete选择列表被Bootstrap模态窗遮挡的完美解决方法
2016/09/23 Javascript
详解基于webpack和vue.js搭建开发环境
2017/04/05 Javascript
关于JavaScript中forEach和each用法浅析
2017/07/27 Javascript
nodejs中express入门和基础知识点学习
2018/09/13 NodeJs
vue表单验证你真的会了吗?vue表单验证(form)validate
2019/04/07 Javascript
微信小程序如何获取群聊的openGid以及名称详解
2019/07/17 Javascript
layui数据表格跨行自动合并的例子
2019/09/02 Javascript
浅谈使用nodejs搭建web服务器的过程
2020/07/20 NodeJs
Vue使用鼠标在Canvas上绘制矩形
2020/12/24 Vue.js
[45:14]Optic vs VP 2018国际邀请赛淘汰赛BO3 第二场 8.24
2018/08/25 DOTA
python实现ip查询示例
2014/03/26 Python
python 计算一个字符串中所有数字的和实例
2019/06/11 Python
Python跳出多重循环的方法示例
2019/07/03 Python
pytorch使用指定GPU训练的实例
2019/08/19 Python
CSS3之2D与3D变换的实现方法
2019/01/28 HTML / CSS
HTML5 video标签(播放器)学习笔记(二):播放控制
2015/04/24 HTML / CSS
Html5移动端网页端适配(js+rem)
2021/02/03 HTML / CSS
味多美官网:蛋糕订购,100%使用天然奶油
2017/11/10 全球购物
澳大利亚连衣裙和女装在线:Esther
2017/11/11 全球购物
Overload和Override的区别
2012/09/02 面试题
大学生简历求职信
2014/06/24 职场文书
个人先进事迹材料范文
2014/12/29 职场文书
升职自荐信范文
2015/03/27 职场文书
2015年实习班主任工作总结
2015/04/23 职场文书
法人代表证明书范本
2015/06/18 职场文书
Golang连接并操作MySQL
2022/04/14 MySQL