最近做生日营销,需要微信发红包,特此从网上找了一篇教程

首先你的有个服务号,并且开通了微信支付,我在这就不说怎么去申请和开通了,我是看了微信官方文档后,想看官方文档的朋友可以到下面这个链接

https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_1

class WxRedPack
{
//配置参数信息
const SHANGHUHAO = "***********";//商户号
const PARTNERKEY = "***********"; //核心支付函数,参数:请求地址和参数
function pay($url, $obj)
{
$obj['nonce_str'] = $this->create_noncestr(); //创建随机字符串
$stringA = $this->create_qianming($obj, false); //创建签名
$stringSignTemp = $stringA . "&key=2470f691aee2bfae92087c10e81cb4d0"; //签名后加api
$sign = strtoupper(md5($stringSignTemp)); //签名加密并大写
$obj['sign'] = $sign; //将签名传入数组
$postXml = $this->arrayToXml($obj); //将参数转为xml格式
$responseXml = $this->curl_post_ssl($url, $postXml); //提交请求
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 .
'cert' . DIRECTORY_SEPARATOR . 'apiclient_cert.pem');
curl_setopt($ch, CURLOPT_SSLKEY, dirname(__FILE__) . DIRECTORY_SEPARATOR .
'cert' . DIRECTORY_SEPARATOR . 'apiclient_key.pem');
curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . DIRECTORY_SEPARATOR .
'cert' . 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;
}
} }
然后调用:
public function setredpack($moneys,$openid)
{
$money = $moneys; //最低1元,单位分
$sender = "******";
$obj2 = array();
$obj2['wxappid'] = "**********"; //appid
$obj2['mch_id'] = "***********"; //商户id
$obj2['mch_billno'] = "********" . date('YmdHis') . rand(1000, 9999);//商户订单号
$obj2['client_ip'] = $_SERVER['REMOTE_ADDR'];
$obj2['re_openid'] = $openid; //接收红包openid
$obj2['total_amount'] = $money;
$obj2['min_value'] = $money;
$obj2['max_value'] = $money;
$obj2['total_num'] = 1;
$obj2['scene_id'] = 'PRODUCT_2';
$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 WxRedPack();
    $res = $wxpay->pay($url, $obj2);return $res; 
}
另一个版本方法:

一个PHP文件搞定微信支付系列之现金红包

网上的很多PHP微信支付接入教程都颇为复杂,且需要配置和引入较多的文件,本人通过整理后给出一个单文件版的,希望可以给各位想接入微信支付的带来些许帮助和借鉴意义。

直接运行该文件即可给指定的微信用户发送现金红包。

需要注意的事项:

  • 1.微信现金红包要求必传证书,需要到https://pay.weixin.qq.com 账户中心->账户设置->API安全->下载证书,然后修改代码中的证书路径

  • 2.默认的使用场景是抽奖(即scene_id参数为PRODUCT_2),额度是1-200元,所以测试时的最低金额是1元。如需修改在产品中心->产品大全->现金红包->产品设置中修改

  • 3.该文件需放到支付授权目录下,可以在微信支付商户平台->产品中心->开发配置中设置。

  • 4.如提示签名错误可以通过微信支付签名验证工具进行验证:https://pay.weixin.qq.com/wik...

  • 5.错误码参照 :https://pay.weixin.qq.com/wik...

  • <?php
    /**
    * 关于微信现金红包的说明
    * 1.微信现金红包要求必传证书,需要到https://pay.weixin.qq.com 账户中心->账户设置->API安全->下载证书,证书路径在第214行和217行修改
    * 2.默认的使用场景是抽奖(即scene_id参数为PRODUCT_2),额度是1-200元,所以测试时的最低金额是1元。如需修改在产品中心->产品大全->现金红包->产品设置中修改
    * 3.错误码参照 :https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_4&index=3
    */
    header('Content-type:text/html; Charset=utf-8');
    $mchid = 'xxxxx'; //微信支付商户号 PartnerID 通过微信支付商户资料审核后邮件发送
    $appid = 'xxxxx'; //微信支付申请对应的公众号的APPID
    $appKey = 'xxxxx'; //微信支付申请对应的公众号的APP Key
    $apiKey = 'xxxxx'; //https://pay.weixin.qq.com 帐户设置-安全设置-API安全-API密钥-设置API密钥 //①、获取当前访问页面的用户openid(如果给指定用户发送红包,则填写指定用户的openid)
    $wxPay = new WxpayService($mchid,$appid,$appKey,$apiKey);
    $openId = $wxPay->GetOpenid(); //获取openid
    if(!$openId) exit('获取openid失败');
    //②、发送红包
    $outTradeNo = uniqid(); //你自己的商品订单号
    $payAmount = 1; //红包金额,单位:元
    $sendName = '织梦猫'; //红包发送者名称
    $wishing = '感谢您参加猜灯谜活动,祝您元宵节快乐!'; //红包祝福语
    $act_name='猜灯谜抢红包活动'; //活动名称
    $result = $wxPay->createJsBizPackage($openId,$payAmount,$outTradeNo,$sendName,$wishing,$act_name);
    echo 'success'; class WxpayService
    {
    protected $mchid;
    protected $appid;
    protected $appKey;
    protected $apiKey;
    public $data = null; public function __construct($mchid, $appid, $appKey,$key)
    {
    $this->mchid = $mchid;
    $this->appid = $appid;
    $this->appKey = $appKey;
    $this->apiKey = $key;
    } /**
    * 通过跳转获取用户的openid,跳转流程如下:
    * 1、设置自己需要调回的url及其其他参数,跳转到微信服务器https://open.weixin.qq.com/connect/oauth2/authorize
    * 2、微信服务处理完成之后会跳转回用户redirect_uri地址,此时会带上一些参数,如:code
    * @return 用户的openid
    */
    public function GetOpenid()
    {
    //通过code获得openid
    if (!isset($_GET['code'])){
    //触发微信返回code码
    $scheme = $_SERVER['HTTPS']=='on' ? 'https://' : 'http://';
    $baseUrl = urlencode($scheme.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].$_SERVER['QUERY_STRING']);
    $url = $this->__CreateOauthUrlForCode($baseUrl);
    Header("Location: $url");
    exit();
    } else {
    //获取code码,以获取openid
    $code = $_GET['code'];
    $openid = $this->getOpenidFromMp($code);
    return $openid;
    }
    } /**
    * 通过code从工作平台获取openid机器access_token
    * @param string $code 微信跳转回来带上的code
    * @return openid
    */
    public function GetOpenidFromMp($code)
    {
    $url = $this->__CreateOauthUrlForOpenid($code);
    $res = self::curlGet($url);
    //取出openid
    $data = json_decode($res,true);
    $this->data = $data;
    $openid = $data['openid'];
    return $openid;
    } /**
    * 构造获取open和access_toke的url地址
    * @param string $code,微信跳转带回的code
    * @return 请求的url
    */
    private function __CreateOauthUrlForOpenid($code)
    {
    $urlObj["appid"] = $this->appid;
    $urlObj["secret"] = $this->appKey;
    $urlObj["code"] = $code;
    $urlObj["grant_type"] = "authorization_code";
    $bizString = $this->ToUrlParams($urlObj);
    return "https://api.weixin.qq.com/sns/oauth2/access_token?".$bizString;
    } /**
    * 构造获取code的url连接
    * @param string $redirectUrl 微信服务器回跳的url,需要url编码
    * @return 返回构造好的url
    */
    private function __CreateOauthUrlForCode($redirectUrl)
    {
    $urlObj["appid"] = $this->appid;
    $urlObj["redirect_uri"] = "$redirectUrl";
    $urlObj["response_type"] = "code";
    $urlObj["scope"] = "snsapi_base";
    $urlObj["state"] = "STATE"."#wechat_redirect";
    $bizString = $this->ToUrlParams($urlObj);
    return "https://open.weixin.qq.com/connect/oauth2/authorize?".$bizString;
    } /**
    * 拼接签名字符串
    * @param array $urlObj
    * @return 返回已经拼接好的字符串
    */
    private function ToUrlParams($urlObj)
    {
    $buff = "";
    foreach ($urlObj as $k => $v)
    {
    if($k != "sign") $buff .= $k . "=" . $v . "&";
    }
    $buff = trim($buff, "&");
    return $buff;
    } /**
    * 发送红包
    * @param string $openid 用户在该公众号下的Openid
    * @param float $totalFee 红包金额 单位元
    * @param string $outTradeNo 订单号
    * @param string $orderName 红包发送者名称
    * @param string $wishing 祝福语
    * @param string $actName 互动名称
    * @return string
    */
    public function createJsBizPackage($openid, $totalFee, $outTradeNo, $sendName,$wishing,$actName)
    {
    $config = array(
    'mch_id' => $this->mchid,
    'appid' => $this->appid,
    'key' => $this->apiKey,
    );
    $unified = array(
    'wxappid' => $config['appid'],
    'send_name' => $sendName,
    'mch_id' => $config['mch_id'],
    'nonce_str' => self::createNonceStr(),
    're_openid' => $openid,
    'mch_billno' => $outTradeNo,
    'client_ip' => '127.0.0.1',
    'total_amount' => intval($totalFee * 100), //单位 转为分
    'total_num'=>1, //红包发放总人数
    'wishing'=>$wishing, //红包祝福语
    'act_name'=>$actName, //活动名称
    'remark'=>'remark', //备注信息,如为中文注意转为UTF8编码
    'scene_id'=>'PRODUCT_2', //发放红包使用场景,红包金额大于200时必传。https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_4&index=3
    );
    $unified['sign'] = self::getSign($unified, $config['key']);
    $responseXml = $this->curlPost('https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack', self::arrayToXml($unified));
    $unifiedOrder = simplexml_load_string($responseXml, 'SimpleXMLElement', LIBXML_NOCDATA);
    if ($unifiedOrder === false) {
    die('parse xml error');
    }
    if ($unifiedOrder->return_code != 'SUCCESS') {
    die($unifiedOrder->return_msg);
    }
    if ($unifiedOrder->result_code != 'SUCCESS') {
    die($unifiedOrder->err_code);
    }
    return true;
    } public static function curlGet($url = '', $options = array())
    {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    if (!empty($options)) {
    curl_setopt_array($ch, $options);
    }
    //https请求 不验证证书和host
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    $data = curl_exec($ch);
    curl_close($ch);
    return $data;
    } public function curlPost($url = '', $postData = '', $options = array())
    {
    if (is_array($postData)) {
    $postData = http_build_query($postData);
    }
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30); //设置cURL允许执行的最长秒数
    if (!empty($options)) {
    curl_setopt_array($ch, $options);
    }
    //https请求 不验证证书和host
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); //第一种方法,cert 与 key 分别属于两个.pem文件
    //默认格式为PEM,可以注释
    curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
    curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/cert/apiclient_cert.pem');
    //默认格式为PEM,可以注释
    curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
    curl_setopt($ch,CURLOPT_SSLKEY,getcwd().'/cert/apiclient_key.pem');
    //第二种方式,两个文件合成一个.pem文件
    // curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/all.pem');
    $data = curl_exec($ch);
    curl_close($ch);
    return $data;
    } public static function createNonceStr($length = 16)
    {
    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    $str = '';
    for ($i = 0; $i < $length; $i++) {
    $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
    }
    return $str;
    }
    public static 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;
    } public static function getSign($params, $key)
    {
    ksort($params, SORT_STRING);
    $unSignParaString = self::formatQueryParaMap($params, false);
    $signStr = strtoupper(md5($unSignParaString . "&key=" . $key));
    return $signStr;
    }
    protected static function formatQueryParaMap($paraMap, $urlEncode = false)
    {
    $buff = "";
    ksort($paraMap);
    foreach ($paraMap as $k => $v) {
    if (null != $v && "null" != $v) {
    if ($urlEncode) {
    $v = urlencode($v);
    }
    $buff .= $k . "=" . $v . "&";
    }
    }
    $reqPar = '';
    if (strlen($buff) > 0) {
    $reqPar = substr($buff, 0, strlen($buff) - 1);
    }
    return $reqPar;
    }
    }
    ?>

    github下载地址:https://github.com/dedemao/we...

微信发红包 PHP 实现的更多相关文章

  1. PHP微信发红包简明教程

    PHP微信发红包简明教程1首先进入公众号申请微信支付 申请成功账号密码会发到你指定的邮箱 是登陆商户平台的2 进入后申请发红包借口3 调用发红包接口 https://api.mch.weixin.qq ...

  2. PHP实现微信发红包功能2

    <?php class wxPay { //配置参数信息 const SHANGHUHAO = "1430998xxx";//商户号 const PARTNERKEY = & ...

  3. 使用PHP编写发红包程序

    使用PHP编写发红包程序 http://www.jb51.net/article/69815.htm 投稿:hebedich 字体:[增加 减小] 类型:转载 时间:2015-07-22   微信发红 ...

  4. PHP实现微信随机红包算法和微信红包的架构设计简介

    微信红包的架构设计简介: 原文:https://www.zybuluo.com/yulin718/note/93148 @来源于QCon某高可用架构群整理,整理朱玉华. 背景:有某个朋友在朋友圈咨询微 ...

  5. 微信小程序红包开发 小程序发红包 开发过程中遇到的坑 微信小程序红包接口的

    最近公司在开发一个小程序红包系统,客户抢到红包需要提现.也就是通过小程序来给用户发红包. 小程序如何来发红包呢?于是我想到两个方法. 之前公众号开发一直用了的.一个是红包接口,一个是企业支付接口.一开 ...

  6. 微信小程序发红包

    背景: 近期一个朋友公司要做活动,活动放在小程序上.小程序开发倒是不难,不过要使用小程序给微信用户发红包,这个就有点麻烦 确定模式: 小程序目前没有发红包接口,要实现的话,只能是模拟红包,即小程序上做 ...

  7. 微信小程序红包开发 小程序发红包 开发过程中遇到的坑 微信小程序红包接口的

    微信小程序红包开发 小程序发红包 开发过程中遇到的坑 微信小程序红包接口的   最近公司在开发一个小程序红包系统,客户抢到红包需要提现.也就是通过小程序来给用户发红包. 小程序如何来发红包呢?于是我想 ...

  8. php微信自动发红包

    <?phpheader('Content-type:text');define("TOKEN", "weixin");$wechatObj = new w ...

  9. C#开发微信门户及应用(34)--微信裂变红包

    在上篇随笔<C#开发微信门户及应用(33)--微信现金红包的封装及使用>介绍了普通现金红包的封装和使用,这种红包只能单独一次发给一个人,用户获取了红包就完成了,如果我们让用户收到红包后,可 ...

随机推荐

  1. ADO.NET 【增】【删】【改】【查】

    数据访问  Using System.Data.SqlClient;   对应命名空间                                       -- SqlConnection   ...

  2. [android] 手机卫士号码归属地查询

    使用小米号码归属地数据库,有两张表data1和data2 先查询data1表,把手机号码截取前7位 select outkey from data1 where id=”前七位手机号” 再查询data ...

  3. [Redis] redis在centos下安装测试

    下载软件,使用命令wget xxx,参数:url 例如: wget http://download.redis.io/releases/redis-3.0.0.tar.gz 解压缩,使用命令tar,参 ...

  4. python中强大优雅的列表推导表达式

    推导表达式其实就是简化一些循环判断操作等 生成一个数字1-10的列表,可以有多少种方法? >>> l = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ] > ...

  5. IE8中jQuery.load()加载页面不显示的原因

    一.jQuery.load() jQuery.load(url,[data],[callback])通过Ajax异步请求加载服务器中的数据,并把数据放到指定元素中. url :请求服务器的地址 dat ...

  6. 2016年CSDN十大博客之星评选,快来投票哈~

    11-28号开始投票,现在处于公示期.这是我的投票链接 : http://blog.csdn.net/vote/candidate.html?username=qq_25827845 重在参与,各位小 ...

  7. 数组、ArrayList、链表、LinkedList

    数组   数组 数组类型 不可重复 无序(线性查找) 可重复(找到第一个即可) 无序(线性查找) 不可重复 有序(二分查找) 可重复(找到第一个即可) 有序(二分查找) 插入 O(N) O(1) O( ...

  8. IIS下众多网站,如何快速定位某站点日志在哪个文件夹?

    windows2008,iis 多站点, 日志.应用程序池都是默认设置, 没有分开………… Logs目录里面有W3SVC43,W3SVC44,W3SVC45,W3SVC46.....等等日志文件夹. ...

  9. 解决IE下select option不支持display none样式

    万恶的IE,option竟然不支持display样式,想到的解决思路有二个: 1.ajax联动查询 2.jQuery的remove().after()方法 方法1的不好之处是初始页面,需要显示全部IP ...

  10. APP主要测试类型及测试点总结

    根据测试重点区分 一.功能性测试 根据产品需求文档编写测试用例: 根据设计文档编写测试用例: 根据UI原型图编写测试用例 二.UI测试 原型图/效果图对比 用户体验 数据模拟:需要考虑正式环境可能的数 ...