最新消息:世上无难事,只要肯放弃。

微信现金红包接口实现给用户发红包

admin 1683 次 0 条

这是我做微信红包时写的一个类,无需大改动只要把商户的东西换成你的就行了。
不熟悉的先看看微信官方文档 https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_4&index=3

下面直接贴代码不罗嗦

<?php
namespace tools;
class SendRedpack{
    /*测试微信企业给个人发红包*/
        /*
         openid为发送用户的openid amount为金额分为单位 wishing为红包祝福语 act_name活动名称
        */
    public function weixin_red_packet($openid,$amount,$wishing,$act_name){
        // 请求参数
        // 随机字符串
        $data['nonce_str']=$this->create_noncestr();
        //签名
        $data['sign']="";
        //商户号,输入你的商户号
        $data['mch_id']="1234567890";
        //商户订单号,可以按要求自己组合28位的商户订单号
        $data['mch_billno']=$data['mch_id'].date("ymd")."888888".rand(1000,9999);
        //公众帐号appid,输入自己的公众号appid,我是写在配置文件里面的,如果不写直接填这里即可
        $data['wxappid']=config('weixin_option.app_id');
        //商户名称
        $data['send_name']="xx商城";
        //用户openid,输入待发红包的用户openid
        $data['re_openid']=$openid;
        //付款金额
        $data['total_amount']=$amount * 100;
        //红包发放总人数
        $data['total_num']="1";
        //红包祝福语
        $data['wishing']=$wishing;
        //IP地址
        $data['client_ip']=$_SERVER["REMOTE_ADDR"];
        //活动名称
        $data['act_name']=$act_name;
        //备注
        $data['remark']="test";
        //场景ID
        // $data['send_id']="PRODUCT_5";
        //活动信息
        // $data['risk_info']="";
        $stringA = $this->formatQueryParaMap($data, false);
        $stringSignTemp = $stringA . "&key=HNLqectikbestsecretkey1483608712";
        $sign = strtoupper(md5($stringSignTemp));
        
        // 生成签名
        $data['sign']=$sign;

        //发红包接口地址
        $url="https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack";

        //将请求数据由数组转换成xml
        $xml=$this->arrayToXml($data);
        //进行请求操作
        $res=$this->curl($xml,$url);
        //将请求结果由xml转换成数组
        $arr=$this->xmltoarray($res);

        // 输出请求结果数组
        return $arr;
    }


    // 将数组转换成xml
    public 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;
    }
    
    // 将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);

        //这个是证书的位置
        $zs1=VENDOR_PATH."/WxPay/cert/cert.pem";
        $zs2=VENDOR_PATH."/WxPay/cert/key.pem";
        curl_setopt($ch,CURLOPT_SSLCERT,$zs1); 
        //这个也是证书的位置
        curl_setopt($ch,CURLOPT_SSLKEY,$zs2); 
        //运行curl
        $data = curl_exec($ch);                                 
        //关闭curl
        curl_close($ch);
     
        return $data;
    }

    //随机字符串
    public 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;
      }
  
    //格式化字符串
    public function formatQueryParaMap($paraMap, $urlencode)
      {
          $buff = "";
          ksort($paraMap);
          foreach ($paraMap as $k => $v){
              if (null != $v && "null" != $v && "sign" != $k) {
                  if($urlencode){
                     $v = urlencode($v);
                  }
                  $buff .= $k . "=" . $v . "&";
              }
          }
          $reqPar;
          if (strlen($buff) > 0) {
              $reqPar = substr($buff, 0, strlen($buff)-1);
          }
          return $reqPar;
    }

    //获取红包信息
    public function getRedPackInfo($mch_billno){
        // 随机字符串
        $arr['nonce_str']=$this->create_noncestr();
        //签名
        $arr['sign']="";
        //商户订单号
        $arr['mch_billno'] = $mch_billno;
        //商户号
        $arr['mch_id'] = "123456789";
        //APPID
        $arr['appid'] = config('weixin_option.app_id');
        //订单类型
        $arr['bill_type'] = "MCHT";

        $string = $this->formatQueryParaMap($arr, false);
        $stringSign = $string . "&key=HNLqectikbestsecretkey123456789";这个key是商户后台设置的key
        $sign = strtoupper(md5($stringSign));

        $arr['sign'] = $sign;

        //查询红包信息接口
        $url="https://api.mch.weixin.qq.com/mmpaymkttransfers/gethbinfo";

        //将请求数据由数组转换成xml
        $xml=$this->arrayToXml($arr);
        //进行请求操作
        $res=$this->curl($xml,$url);
        //将请求结果由xml转换成数组
        $arr=$this->xmltoarray($res);

        // 输出请求结果数组
        return $arr;
    }

}
发表我的评论

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址