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 相关文章推荐
输出控制类
Oct 09 PHP
抓取YAHOO股票报价的类
May 15 PHP
php设计模式 Delegation(委托模式)
Jun 26 PHP
PHP函数之日期时间函数date()使用详解
Sep 09 PHP
php递归获取目录内文件(包含子目录)封装类分享
Dec 25 PHP
学习php设计模式 php实现享元模式(flyweight)
Dec 07 PHP
PHP生成各种常见验证码和Ajax验证过程
Jan 10 PHP
PHP格式化MYSQL返回float类型的方法
Mar 30 PHP
浅谈PHP中的
Apr 23 PHP
PHP中常用的数组操作方法笔记整理
May 16 PHP
thinkphp5.0自定义验证规则使用方法
Nov 16 PHP
PHP设计模式(七)组合模式Composite实例详解【结构型】
May 02 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 pcntl_fork和pcntl_fork 的用法
2009/04/13 PHP
php数组中包含中文的排序方法
2014/06/03 PHP
php魔术函数__call()用法实例分析
2015/02/13 PHP
PHP中的魔术方法总结和使用实例
2015/05/11 PHP
微信支付开发交易通知实例
2016/07/12 PHP
php实现自定义中奖项数和概率的抽奖函数示例
2017/05/26 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
2018/03/02 PHP
PHP的JSON封装、转变及输出操作示例
2019/09/27 PHP
PHP的cookie与session原理及用法详解
2019/09/27 PHP
jQuery textarea的长度进行验证
2009/05/06 Javascript
js创建表单元素并使用submit进行提交
2014/08/14 Javascript
jQuery中ajax的post()方法用法实例
2014/12/26 Javascript
JS实现带缓冲效果打开、关闭、移动一个层的方法
2015/05/09 Javascript
PHP+MySQL+jQuery随意拖动层并即时保存拖动位置实例讲解
2015/10/09 Javascript
JavaScript的History API使搜索引擎抓取AJAX内容
2015/12/07 Javascript
jQuery validate+artdialog+jquery form实现弹出表单思路详解
2016/04/18 Javascript
基于Bootstrap的UI扩展 StyleBootstrap
2016/06/17 Javascript
nodejs实现邮件发送服务实例分享
2017/03/29 NodeJs
Vue2.0基于vue-cli+webpack Vuex的用法(实例讲解)
2017/09/15 Javascript
Mac下通过brew安装指定版本的nodejs教程
2018/05/17 NodeJs
详解create-react-app 自定义 eslint 配置
2018/06/07 Javascript
详解原生JS回到顶部
2019/03/25 Javascript
javascript实现前端input密码输入强度验证
2020/06/24 Javascript
使用python实现生成用户信息
2017/03/20 Python
利用Python如何生成hash值示例详解
2017/12/20 Python
解决Python2.7读写文件中的中文乱码问题
2018/04/12 Python
Python3.6使用tesseract-ocr的正确方法
2018/10/17 Python
在Python dataframe中出生日期转化为年龄的实现方法
2018/10/20 Python
使用python Fabric动态修改远程机器hosts的方法
2018/10/26 Python
对python numpy.array插入一行或一列的方法详解
2019/01/29 Python
公共事业管理本科生求职信
2013/10/07 职场文书
爱心捐书活动总结
2014/07/05 职场文书
《周恩来的四个昼夜》观后思想汇报范文两篇
2014/09/10 职场文书
秋季运动会广播稿(30篇)
2014/09/13 职场文书
高中课前三分钟演讲稿
2014/09/13 职场文书
小学秋季运动会通讯稿
2015/11/25 职场文书