PHP微信红包API接口


Posted in PHP onDecember 05, 2015

首先给大家看一看这个表格:

PHP微信红包API接口

根据微信高级红包接口,开发PHP版本的API接口,现在进行主要代码分析。

红包接口调用请求代码,所有请求参数为必填参数与文档对应:

class Wxapi {
 private $app_id = 'wxXXXXXXXXXXXX'; //公众账号appid,首先申请与之配套的公众账号
 private $app_secret = 'XXXXXXXXXXXXXXXXXXXXXXXX';//公众号secret,用户获取用户授权token
 private $app_mchid = 'XXXXXXXX';//商户号id
 function __construct(){
 //do sth here....
 }
 /**
  * 微信支付
  * @param string $openid 用户openid
  */
 public function pay($re_openid)
 {
  include_once('WxHongBaoHelper.php');
  $commonUtil = new CommonUtil();
  $wxHongBaoHelper = new WxHongBaoHelper();
  $wxHongBaoHelper->setParameter("nonce_str", $this->great_rand());//随机字符串,丌长于 32 位
  $wxHongBaoHelper->setParameter("mch_billno", $this->app_mchid.date('YmdHis').rand(1000, 9999));//订单号
  $wxHongBaoHelper->setParameter("mch_id", $this->app_mchid);//商户号
  $wxHongBaoHelper->setParameter("wxappid", $this->app_id);
  $wxHongBaoHelper->setParameter("nick_name", '红包');//提供方名称
  $wxHongBaoHelper->setParameter("send_name", '红包');//红包发送者名称
  $wxHongBaoHelper->setParameter("re_openid", $re_openid);//相对于医脉互通的openid
  $wxHongBaoHelper->setParameter("total_amount", 100);//付款金额,单位分
  $wxHongBaoHelper->setParameter("min_value", 100);//最小红包金额,单位分
  $wxHongBaoHelper->setParameter("max_value", 100);//最大红包金额,单位分
  $wxHongBaoHelper->setParameter("total_num", 1);//红包?Х抛苋耸
  $wxHongBaoHelper->setParameter("wishing", '感谢您参与红包派发活动,祝您新年快乐!');//红包祝福诧
  $wxHongBaoHelper->setParameter("client_ip", '127.0.0.1');//调用接口的机器 Ip 地址
  $wxHongBaoHelper->setParameter("act_name", '红包活动');//活劢名称
  $wxHongBaoHelper->setParameter("remark", '快来抢!');//备注信息
  $postXml = $wxHongBaoHelper->create_hongbao_xml();
  $url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack';
  $responseXml = $wxHongBaoHelper->curl_post_ssl($url, $postXml);
  //用作结果调试输出
  //echo htmlentities($responseXml,ENT_COMPAT,'UTF-8');
 $responseObj = simplexml_load_string($responseXml, 'SimpleXMLElement', LIBXML_NOCDATA);
 return $responseObj->return_code;
 }

获取随机字符串方法:

/**
 * 生成随机数
 */  
public function great_rand(){
 $str = '1234567890abcdefghijklmnopqrstuvwxyz';
 for($i=0;$i<30;$i++){
  $j=rand(0,35);
  $t1 .= $str[$j];
 }
 return $t1; 
}

 签名算法:

/**
例如:
appid: wxd111665abv58f4f
mch_id: 10000100
device_info: 1000
Body: test
nonce_str: ibuaiVcKdpRxkhJA
第一步:对参数按照 key=value 的格式,并按照参数名 ASCII 字典序排序如下:
stringA="appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_i
d=10000100&nonce_str=ibuaiVcKdpRxkhJA";
第二步:拼接支付密钥:
stringSignTemp="stringA&key=192006250b4c09247ec02edce69f6a2d"
sign=MD5(stringSignTemp).toUpperCase()="9A0A8659F005D6984697E2CA0A
9CF3B7"
*/
protected function get_sign(){
 define('PARTNERKEY',"QSRXXXXXXXXXXXXXXXXXXXXX");
 try {
  if (null == PARTNERKEY || "" == PARTNERKEY ) {
   throw new SDKRuntimeException("密钥不能为空!" . "<br>");
  }
  if($this->check_sign_parameters() == false) { //检查生成签名参数
   throw new SDKRuntimeException("生成签名参数缺失!" . "<br>");
  }
  $commonUtil = new CommonUtil();
  ksort($this->parameters);
  $unSignParaString = $commonUtil->formatQueryParaMap($this->parameters, false);
  $md5SignUtil = new MD5SignUtil();
  return $md5SignUtil->sign($unSignParaString,$commonUtil->trimString(PARTNERKEY));
 }catch (SDKRuntimeException $e)
 {
  die($e->errorMessage());
 }
 
}

CURL请求以及发送证书:

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;
 }
}

入口文件:

@require "pay.php";
//获取用户信息
$get = $_GET['param'];
$code = $_GET['code'];
//判断code是否存在
if($get=='access_token' && !empty($code)){
 $param['param'] = 'access_token';
 $param['code'] = $code;
 $packet = new Packet();
 //获取用户openid信息
 $userinfo = $packet->_route('userinfo',$param);
 if(empty($userinfo['openid'])){
  exit("NOAUTH");
 }
 //调取支付方法
 $packet->_route('wxpacket',array('openid'=>$userinfo['openid']));
}else{
 $packet->_route('userinfo');
}

以上就是关于PHP微信红包API接口的详细代码,分享给大家,希望对大家的学习有所帮助。

PHP 相关文章推荐
第二章 PHP入门基础之php代码写法
Dec 30 PHP
PHP删除HTMl标签的实现代码
Jun 30 PHP
php var_export与var_dump 输出的不同
Aug 09 PHP
用php简单实现加减乘除计算器
Jan 06 PHP
php统计文章排行示例
Mar 04 PHP
PHP正则替换函数preg_replace和preg_replace_callback使用总结
Sep 22 PHP
php header函数的常用http头设置
Jun 25 PHP
Yii针对添加行的增删改查操作示例
Oct 18 PHP
PHP区块查询实现方法分析
May 12 PHP
thinkPHP框架实现多表查询的方法
Jun 14 PHP
PHP扩展mcrypt实现的AES加密功能示例
Jan 29 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
Apr 02 PHP
php实现微信发红包
Dec 05 #PHP
详解php比较操作符的安全问题
Dec 03 #PHP
thinkPHP模型初始化实例分析
Dec 03 #PHP
ZF框架实现发送邮件的方法
Dec 03 #PHP
PHP实现的蚂蚁爬杆路径算法代码
Dec 03 #PHP
PHP实现QQ空间自动回复说说的方法
Dec 02 #PHP
如何在旧的PHP系统中使用PHP 5.3之后的库
Dec 02 #PHP
You might like
十天学会php之第八天
2006/10/09 PHP
Discuz 模板引擎的封装类代码
2008/07/18 PHP
php HandlerSocket的使用
2011/05/02 PHP
centos下file_put_contents()无法写入文件的原因及解决方法
2017/04/01 PHP
JS 巧妙获取剪贴板数据 Excel数据的粘贴
2009/07/09 Javascript
Jquery带搜索框的下拉菜单
2013/05/06 Javascript
setInterval()和setTimeout()的用法和区别示例介绍
2013/11/17 Javascript
JS实现的生成随机数的4个函数分享
2015/02/11 Javascript
jquery图片切换插件
2015/03/16 Javascript
基于JavaScript实现动态添加删除表格的行
2016/02/01 Javascript
Bootstrap模块dropdown实现下拉框响应
2016/05/22 Javascript
Angularjs验证用户输入的字符串是否为日期时间
2017/06/01 Javascript
简单谈谈js的数据类型
2017/09/25 Javascript
Node.js成为Web应用开发最佳选择的原因
2018/02/05 Javascript
微信小程序实现自定义加载图标功能
2018/07/19 Javascript
用node开发并发布一个cli工具的方法步骤
2019/01/03 Javascript
jQuery无冲突模式详解
2019/01/17 jQuery
Vue 使用beforeEach实现登录状态检查功能
2019/10/31 Javascript
[06:10]6.81新信使新套装!给你一个炫酷的DOTA2
2014/05/06 DOTA
[02:43]2014DOTA2国际邀请赛 官方Alliance战队纪录片
2014/07/14 DOTA
常用python数据类型转换函数总结
2014/03/11 Python
Python3处理HTTP请求的实例
2018/05/10 Python
python使用turtle库与random库绘制雪花
2018/06/22 Python
Python列表常见操作详解(获取,增加,删除,修改,排序等)
2019/02/18 Python
python pygame 愤怒的小鸟游戏示例代码
2021/02/25 Python
教你如何一步一步用Canvas写一个贪吃蛇
2018/10/22 HTML / CSS
复古斯堪的纳维亚儿童服装:Baby go Retro
2017/09/09 全球购物
Tripadvisor新西兰:阅读评论,比较价格和酒店预订
2018/02/10 全球购物
在线购买澳大利亚设计师手拿包和奢华晚装手袋:Olga Berg
2019/03/20 全球购物
线程的基本概念、线程的基本状态以及状态之间的关系
2012/10/26 面试题
大学生表扬信范文
2014/01/09 职场文书
升国旗仪式主持词
2014/03/19 职场文书
2014年教师节国旗下讲话稿
2014/09/10 职场文书
餐厅感恩节活动策划方案
2014/10/11 职场文书
初中开学典礼新闻稿
2015/07/17 职场文书
使用react-virtualized实现图片动态高度长列表的问题
2021/05/28 Javascript