PHP开发的微信现金红包功能示例


Posted in PHP onJune 29, 2017

本文实例讲述了PHP开发的微信现金红包功能。分享给大家供大家参考,具体如下:

微信商家后台-现金红包开发

sdk

<?php
class wxPay {
  //配置参数信息
  const SHANGHUHAO = "1430998xxx";//商户号
  const PARTNERKEY = "leFyTOXWzUEXxfp47WOu5d9xxxxxx";  //api,商户后台
  //核心支付函数,参数:请求地址和参数
  function pay($url,$obj) {
    $obj['nonce_str'] = $this->create_noncestr();  //创建随机字符串
    $stringA = $this->create_qianming($obj,false);  //创建签名
    $stringSignTemp = $stringA."&key=leFyTOXWzUEXxfp47WOu5xxxxxx";  //签名后加api
    $sign = strtoupper(md5($stringSignTemp));  //签名加密并大写
    $obj['sign'] = $sign;  //将签名传入数组
    $postXml = $this->arrayToXml($obj);  //将参数转为xml格式
    var_dump($postXml);
    $responseXml = $this->curl_post_ssl($url,$postXml);  //提交请求
    var_dump($responseXml);
    return $responseXml;
  }
  //生成签名,参数:生成签名的参数和是否编码
  function create_qianming($arr,$urlencode) {
    $buff = "";
    ksort($arr); //对传进来的数组参数里面的内容按照字母顺序排序,a在前面,z在最后(字典序)
    foreach ($arr as $k=>$v) {
      if(null!=$v && "null" != $v && "sign" != $k) {  //签名不要转码
        if ($urlencode) {
          $v = urlencode($v);
        }
        $buff.=$k."=".$v."&";
      }
    }
    if (strlen($buff)>0) {
      $reqPar = substr($buff,0,strlen($buff)-1); //去掉末尾符号“&”
    }
    return $reqPar;
  }
  //生成随机字符串,默认32位
  function create_noncestr($length=32) {
    //创建随机字符
    $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    $str = "";
    for($i=0;$i<$length;$i++) {
      $str.=substr($chars, mt_rand(0,strlen($chars)-1),1);
    }
    return $str;
  }
  //数组转xml
  function arrayToXml($arr) {
    $xml = "<xml>";
    foreach ($arr as $key=>$val) {
      if (is_numeric($val)) {
        $xml.="<".$key.">".$val."</".$key.">";
      } else {
        $xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
      }
    }
    $xml.="</xml>";
    return $xml;
  }
  //post请求网站,需要证书
  function curl_post_ssl($url, $vars, $second=30,$aHeader=array())
  {
    $ch = curl_init();
    //超时时间
    curl_setopt($ch,CURLOPT_TIMEOUT,$second);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
    //这里设置代理,如果有的话
    curl_setopt($ch,CURLOPT_URL,$url);
    curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
    curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);
    //cert 与 key 分别属于两个.pem文件
    //请确保您的libcurl版本是否支持双向认证,版本高于7.20.1
    curl_setopt($ch,CURLOPT_SSLCERT,dirname(__FILE__).DIRECTORY_SEPARATOR.
        'zhengshu'.DIRECTORY_SEPARATOR.'apiclient_cert.pem');
    curl_setopt($ch,CURLOPT_SSLKEY,dirname(__FILE__).DIRECTORY_SEPARATOR.
        'zhengshu'.DIRECTORY_SEPARATOR.'apiclient_key.pem');
    curl_setopt($ch,CURLOPT_CAINFO,dirname(__FILE__).DIRECTORY_SEPARATOR.
        'zhengshu'.DIRECTORY_SEPARATOR.'rootca.pem');
    if( count($aHeader) >= 1 ){
      curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);
    }
    curl_setopt($ch,CURLOPT_POST, 1);
    curl_setopt($ch,CURLOPT_POSTFIELDS,$vars);
    $data = curl_exec($ch);
    if($data){
      curl_close($ch);
      return $data;
    }
    else {
      $error = curl_errno($ch);
      echo "call faild, errorCode:$error\n";
      curl_close($ch);
      return false;
    }
  }
}

证书文件:

请在微信商户后台-API安全下载,PHP请使用php的证书文件

微信红包调用测试文件:

<?php
require 'wxpay.class.php';<br><br>//数组参数
$money = 100; //最低1元,单位分
$sender = "晨缘房产";
$obj2 = array();
$obj2['wxappid'] = ""; //appid
$obj2['mch_id'] = "";//商户id
$obj2['mch_billno'] = "商户id".date('YmdHis').rand(1000,9999);//组合成28位,根据官方开发文档,可以自行设置
$obj2['client_ip'] = $_SERVER['REMOTE_ADDR'];
$obj2['re_openid'] = "oUxO6v26wdyMHThD9kfDW6NB_xbE";//接收红包openid
$obj2['total_amount'] = $money;
$obj2['min_value'] = $money;
$obj2['max_value'] = $money;
$obj2['total_num'] = 1;
$obj2['nick_name'] = $sender;
$obj2['send_name'] = $sender;
$obj2['wishing'] = "恭喜发财";
$obj2['act_name'] = $sender."红包";
$obj2['remark'] = $sender."红包";
$url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack";
$wxpay = new wxPay();
$res = $wxpay->pay($url, $obj2);
var_dump($res);

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

PHP 相关文章推荐
PHP将XML转数组过程详解
Nov 13 PHP
PHP判断远程图片是否存在的几种方法
May 04 PHP
php数组索引的Key加引号和不加引号的区别
Aug 19 PHP
Linux+Nginx+MySQL下配置论坛程序Discuz的基本教程
Dec 23 PHP
PHP数据的提交与过滤基本操作实例详解
Nov 11 PHP
php中static和const关键字用法分析
Dec 07 PHP
PHP 文件锁与进程锁的使用示例
Aug 07 PHP
如何修改Laravel中url()函数生成URL的根地址
Aug 11 PHP
PHP给前端返回一个JSON对象的实例讲解
May 31 PHP
PHP通过curl获取接口URL的数据方法
May 31 PHP
YII框架常用技巧总结
Apr 27 PHP
PHP使用Redis队列执行定时任务实例讲解
Mar 24 PHP
PHP实现微信模拟登陆并给用户发送消息的方法【文字,图片,图文】
Jun 29 #PHP
php实现微信模拟登陆、获取用户列表及群发消息功能示例
Jun 28 #PHP
Symfony2针对输入时间进行查询的方法分析
Jun 28 #PHP
Symfony查询方法实例小结
Jun 28 #PHP
关于PHP转换超过2038年日期出错的问题解决
Jun 28 #PHP
YII2自动登录Cookie总是失效的解决方法
Jun 28 #PHP
php的常量和变量实例详解
Jun 27 #PHP
You might like
十天学会php之第六天
2006/10/09 PHP
php实现遍历多维数组的方法
2015/11/25 PHP
thinkPHP批量删除的实现方法分析
2016/11/09 PHP
jquery text,radio,checkbox,select操作实现代码
2009/07/09 Javascript
document.getElementById为空或不是对象的解决方法
2010/01/24 Javascript
javascript检测页面是否缩放的小例子
2013/05/16 Javascript
目前流行的JavaScript库的介绍及对比
2013/09/29 Javascript
JavaScript显示表单内元素数量的方法
2015/04/02 Javascript
浅析JS运动
2015/12/28 Javascript
jQuery 遍历map()方法详解
2016/11/04 Javascript
canvas绘制一个常用的emoji表情
2017/03/30 Javascript
vue.js中v-on:textInput无法执行事件问题的解决过程
2017/07/12 Javascript
NodeJS实现自定义流的方法
2018/08/01 NodeJs
vue组件化中slot的基本使用方法
2019/05/01 Javascript
react 中父组件与子组件双向绑定问题
2019/05/20 Javascript
Vue 动态路由的实现及 Springsecurity 按钮级别的权限控制
2019/09/05 Javascript
vue-router的hooks用法详解
2020/06/08 Javascript
vue+element-ui JYAdmin后台管理系统模板解析
2020/07/28 Javascript
js中复选框的取值及赋值示例详解
2020/10/18 Javascript
[01:18:36]LGD vs VP Supermajor 败者组决赛 BO3 第一场 6.10
2018/07/04 DOTA
python爬虫获取多页天涯帖子
2018/02/23 Python
Python requests库用法实例详解
2018/08/14 Python
Python File(文件) 方法整理
2019/02/18 Python
python实现诗歌游戏(类继承)
2019/02/26 Python
Python实现队列的方法示例小结【数组,链表】
2020/02/22 Python
Python字符串函数strip()原理及用法详解
2020/07/23 Python
python help函数实例用法
2020/12/06 Python
关于 HTML5 的七个传说小结
2012/04/12 HTML / CSS
Expedia西班牙:预订酒店、机票、旅行和廉价度假套餐
2019/04/10 全球购物
西班牙在线宠物食品和配件商店:bitiba
2019/10/11 全球购物
物流管理毕业生自荐信
2013/10/24 职场文书
简单租房协议书
2014/04/09 职场文书
《祁黄羊》教学反思
2014/04/22 职场文书
中职招生先进个人材料
2014/08/31 职场文书
党的群众路线教育实践活动方案
2014/10/31 职场文书
VS2019连接MySQL数据库的过程及常见问题总结
2021/11/27 MySQL