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 相关文章推荐
聊天室php&amp;mysql(五)
Oct 09 PHP
php Smarty初体验二 获取配置信息
Aug 08 PHP
php获取通过http协议post提交过来xml数据及解析xml
Dec 16 PHP
php获取数组中重复数据的两种方法
Jun 28 PHP
ThinkPHP之N方法实例详解
Jun 20 PHP
php实现与erlang的二进制通讯实例解析
Jul 23 PHP
简单谈谈favicon
Jun 10 PHP
PHP封装CURL扩展类实例
Jul 28 PHP
修改Laravel5.3中的路由文件与路径
Aug 10 PHP
利用Homestead快速运行一个Laravel项目的方法详解
Nov 14 PHP
Yii框架参数配置文件params用法实例分析
Sep 11 PHP
phpQuery解析HTML乱码问题(补充官网未列出的乱码解决方案)
Apr 01 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
php实现的Captcha验证码类实例
2014/09/22 PHP
php使用sql server验证连接数据库的方法
2014/12/25 PHP
php常用表单验证类用法实例
2015/06/18 PHP
smarty模板数学运算示例
2016/12/11 PHP
PHP+ajax实现上传、删除、修改单张图片及后台处理逻辑操作详解
2020/02/12 PHP
jquery中获得$.ajax()事件返回的值并添加事件的方法
2010/04/15 Javascript
js和css写一个可以自动隐藏的悬浮框
2014/03/05 Javascript
js构造函数、索引数组和属性的实现方式和使用
2014/11/16 Javascript
AngularJS基础 ng-list 指令详解及示例代码
2016/08/02 Javascript
js内置对象处理_打印学生成绩单的简单实现
2016/09/24 Javascript
Vue+element-ui 实现表格的分页功能示例
2018/08/18 Javascript
微信小程序分享海报生成的实现方法
2018/12/10 Javascript
微信小程序3种位置API的使用方法详解
2019/08/05 Javascript
整理 node-sass 安装失败的原因及解决办法(小结)
2020/02/19 Javascript
js实现简单五子棋游戏
2020/05/28 Javascript
WebPack工具运行原理及入门教程
2020/12/02 Javascript
[03:38]TI4西雅图DOTA2前线报道 71专访
2014/07/08 DOTA
Python可跨平台实现获取按键的方法
2015/03/05 Python
简单掌握Python的Collections模块中counter结构的用法
2016/07/07 Python
Python简单实现自动删除目录下空文件夹的方法
2017/08/29 Python
Python3 批量扫描端口的例子
2019/07/25 Python
Python通过两个dataframe用for循环求笛卡尔积
2020/04/29 Python
python判断一个变量是否已经设置的方法
2020/08/13 Python
css3截图_动力节点Java学院整理
2017/07/11 HTML / CSS
Delphi工程师笔试题
2013/09/21 面试题
建筑专业毕业生推荐信
2013/11/21 职场文书
商务英语求职自荐信范文
2013/12/24 职场文书
珍惜资源保护环境的建议书
2014/05/14 职场文书
优秀应届生求职信
2014/06/16 职场文书
党员批评与自我批评思想汇报(集锦)
2014/09/14 职场文书
售房协议书范本
2015/08/11 职场文书
2015秋季田径运动会广播稿
2015/08/19 职场文书
化工生产实习心得体会
2016/01/22 职场文书
JS Object构造函数之Object.freeze
2021/04/28 Javascript
JavaScript流程控制(循环)
2021/12/06 Javascript
springboot读取resources下文件的方式详解
2022/06/21 Java/Android