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 相关文章推荐
一个查看session内容的函数
Oct 09 PHP
mysql+php分页类(已测)
Mar 31 PHP
php split汉字
Jun 05 PHP
PHP扩展编写点滴 技巧收集
Mar 09 PHP
一个PHP验证码类代码分享(已封装成类)
Jul 17 PHP
PHP数据流应用的一个简单实例
Sep 14 PHP
PHP验证码函数代码(简单实用)
Sep 29 PHP
php 过滤英文标点符号及过滤中文标点符号代码
Jun 12 PHP
php中ob_flush函数和flush函数用法分析
Mar 18 PHP
php商品对比功能代码分享
Sep 24 PHP
PHP QRCODE生成彩色二维码的方法
May 19 PHP
php 广告点击统计代码(php+mysql)
Feb 21 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生成txt文件标题及内容的方法
2014/01/16 PHP
PHP static局部静态变量和全局静态变量总结
2014/03/02 PHP
php绘制圆形的方法
2015/01/24 PHP
php使用Session和文件统计在线人数
2015/07/04 PHP
php使用GD2绘制几何图形示例
2017/02/15 PHP
可兼容php5与php7的cURL文件上传功能实例分析
2018/05/11 PHP
Jquery实现的一种常用高亮效果示例代码
2014/01/28 Javascript
jquery遍历checkbox的注意事项说明
2014/02/21 Javascript
浅谈JavaScript实现面向对象中的类
2014/12/09 Javascript
weUI应用之JS常用信息提示弹层的封装
2016/11/21 Javascript
Vue 项目分环境打包的方法示例
2018/08/03 Javascript
Angular ElementRef简介及其使用
2018/10/01 Javascript
详解Bootstrap 学习(一)入门
2019/04/12 Javascript
微信小程序获取地理位置及经纬度授权代码实例
2019/09/18 Javascript
node.js 使用 net 模块模拟 websocket 握手进行数据传递操作示例
2020/02/11 Javascript
[01:32:22]DOTA2-DPC中国联赛 正赛 Ehome vs VG BO3 第一场 2月5日
2021/03/11 DOTA
python基础教程之类class定义使用方法
2014/02/20 Python
10个易被忽视但应掌握的Python基本用法
2015/04/01 Python
Python实现的爬虫功能代码
2017/06/24 Python
python连接数据库的方法
2017/10/19 Python
Python实现中一次读取多个值的方法
2018/04/22 Python
numpy.linspace 生成等差数组的方法
2018/07/02 Python
python之pymysql模块简单应用示例代码
2019/12/16 Python
Python如何读取文件中图片格式
2020/01/13 Python
Tensorflow 实现将图像与标签数据转化为tfRecord文件
2020/02/17 Python
优秀的茶餐厅创业计划书
2014/01/03 职场文书
园艺师求职信
2014/04/27 职场文书
中秋手机店促销方案
2014/06/16 职场文书
红歌会主持词
2015/07/02 职场文书
Python使用UDP实现720p视频传输的操作
2021/04/24 Python
Java移除无效括号的方法实现
2021/08/07 Java/Android
Python人工智能之混合高斯模型运动目标检测详解分析
2021/11/07 Python
django 认证类配置实现
2021/11/11 Python
【海涛dota解说】DCG联赛第一周 LGD VS DH
2022/04/01 DOTA
把77A收信机改造成收音机
2022/04/05 无线电
蓝牙耳机怎么连接电脑win11? Win11蓝牙耳机连接电脑的技巧
2023/01/09 数码科技