侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

使用PHP实现微信摇一摇周边红包

微信(小程序)  /  管理员 发布于 7年前   192

最近接了个项目,其中有需求是要实现摇一摇红包功能,在网上搜了好久,都没有找到源码,没办法,只有自动写了,下面小编把我的劳动成果分享给大家供大家参考,本文写的不好,还请各位大侠提出宝贵意见,共同学习进步。

微信官方说明如下

摇一摇红包说明

功能说明

摇一摇周边红包接口是为线下商户提供的发红包功能。用户可以在商家门店等线下场所通过摇一摇周边领取商家发放的红包,在线上转发分享无效。

开发者可通过接口开发摇一摇红包功能,特点包括:
 1.可选择使用模板加载页或自定义Html5页面调起微信原生红包页面(详见创建红包活动中use_template字段,1为使用模板,2为使用自定义Html5页面)
 2.原生红包页面拆红包,无需通过公众号消息下发
 3.提供关注公众号能力,用户可自行选择是否关注(裂变红包分享时无效)
 4.完成页面可配置跳转链接,可跳转商户的其他自定义Html5页面
 5.同一个用户在单个红包活动中只能领取1次红包

用户侧交互流程

红包组件接口调用流程

1. 申请红包接口权限:登录摇一摇周边商户后台https://zb.weixin.qq.com ,进入开发者支持,申请开通摇一摇红包组件接口;
2. 红包预下单:调用微信支付的api进行红包预下单,告知需要发放的红包金额,人数,生成红包ticket;
3. 创建活动并录入红包信息:调用摇周边平台的api录入创建红包活动并录入信息,传入预下单时生成的红包ticket;
4. 调用jsapi抽红包:在摇出的页面中通过调用jsapi抽红包,抽中红包的用户可以拆红包;
5. 调用以上接口时,红包提供商户和红包发放商户公众号要求一致。

 说明:

  红包提供商户:红包预下单接口传入的参数wxappid所代表的商户
  红包发放商户:调用红包接口创建红包活动、录入红包信息、发放红包的商户公众号所以步骤应该是 ① 创建红包活动 ② 预下单 ③ 录入红包找出来了之前整理的类 在写一下1.创建活动

接口说明

创建红包活动,设置红包活动有效期,红包活动开关等基本信息,返回活动id

接口调用说明

 服务器端调用

http请求方式: POST
URL: https://api.weixin.qq.com/shakearound/lottery/addlotteryinfo?access_token=ACCESSTOKEN&use_template=1&logo_url=LOGO_URL

请求参数说明

请求示例

 Content-Type: application/json Post Body:{       "title": "title",   "desc": "desc",    "onoff": 1,      "begin_time": 1428854400,   "expire_time": 1428940800,   "sponsor_appid": "wxxxxxxxxxxxxxx", "total": 10, "jump_url": JUMP_URL,    "key": "keyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"  }

返回数据说明

示例

 {    "errcode":0,    "errmsg":"",    "lottery_id":"xxxxxxllllll",  "page_id":1, }/** * 摇一摇红包 创建活动 * @author jiosen */class addlotteryinfo_pub extends Wxpay_client_pub{  var $code;//code码,用以获取openid  var $openid;//用户的openid  function __construct($access_token,$logo)  {    //设置接口链接    $this->url = "https://api.weixin.qq.com/shakearound/lottery/addlotteryinfo?access_token=".$access_token."&use_template=1&logo_url=".$logo;    //设置curl超时时间    $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;  }  /**   * 生成接口参数 json   */  function createJson()  {    try    {      //检测必填参数      if($this->parameters["title"] == null)      {        throw new SDKRuntimeException("缺少抽奖活动名称title!"."
"); }elseif ($this->parameters["desc"] == null ) { throw new SDKRuntimeException("缺少抽奖活动描述desc!"."
"); }elseif ($this->parameters["begin_time"] == null) { throw new SDKRuntimeException("缺少活动开始时间 begin_time!"."
"); }elseif ($this->parameters["expire_time"] == null) { throw new SDKRuntimeException("缺少活动结束时间 expire_time!"."
"); }elseif ($this->parameters["total"] == null) { throw new SDKRuntimeException("缺少红包总数total!"."
"); }elseif ($this->parameters["jump_url"] == null) { throw new SDKRuntimeException("缺少红包关注跳转连接jump_url!"."
"); }elseif ($this->parameters["key"] == null) { throw new SDKRuntimeException("缺少红包key!"."
"); } $this->parameters["title"] = urlencode($this->parameters["title"]); $this->parameters["desc"] = urlencode($this->parameters["desc"]); $this->parameters["onoff"] = '1';//开启活动 $this->parameters["sponsor_appid"] = WxPayConf_pub::APPID;//公众账号ID //var_dump($this->parameters); //echo json_encode($this->parameters); return json_encode($this->parameters); }catch (SDKRuntimeException $e) { die($e->errorMessage()); } } function hbpreorder() { $data = $this->createJson(); $result = $this->curl_post($this->url,urldecode($data)); $result = json_decode($result); return $result; } function curl_post($url,$data) { $curl = curl_init($url); curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30); curl_setopt($curl, CURLOPT_TIMEOUT, 10); curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_POST, 1);//发送一个常规的Post请求 curl_setopt($curl, CURLOPT_POSTFIELDS, $data);//Post提交的数据包 $rv = curl_exec($curl);//输出内容 curl_close($curl); return $rv; } /** * 作用:生成可以获得code的url */ function createOauthUrlForCode($redirectUrl) { $urlObj["appid"] = WxPayConf_pub::APPID; $urlObj["redirect_uri"] = "$redirectUrl"; $urlObj["response_type"] = "code"; $urlObj["scope"] = "snsapi_base"; $urlObj["state"] = "STATE"."#wechat_redirect"; $bizString = $this->formatBizQueryParaMap($urlObj, false); return "https://open.weixin.qq.com/connect/oauth2/authorize?".$bizString; } /** * 作用:生成可以获得openid的url */ function createOauthUrlForOpenid() { $urlObj["appid"] = WxPayConf_pub::APPID; $urlObj["secret"] = WxPayConf_pub::APPSECRET; $urlObj["code"] = $this->code; $urlObj["grant_type"] = "authorization_code"; $bizString = $this->formatBizQueryParaMap($urlObj, false); return "https://api.weixin.qq.com/sns/oauth2/access_token?".$bizString; } /** * 作用:通过curl向微信提交code,以获取openid */ function getOpenid() { $url = $this->createOauthUrlForOpenid(); //初始化curl $ch = curl_init(); //设置超时 curl_setopt($ch, CURLOP_TIMEOUT, $this->curl_timeout); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE); curl_setopt($ch, CURLOPT_HEADER, FALSE); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); //运行curl,结果以jason形式返回 $res = curl_exec($ch); curl_close($ch); $data = json_decode($res,true); $this->openid = $data['openid']; return $this->openid; } /** * 作用:设置code */ function setCode($code_) { $this->code = $code_; }}

 要注意提交的数据是json 不是xml

前端页面随便做一下


php 代码

$title = $_POST['title']; $file = $_FILES['img']; $tools = new Tools(); //这是一个文件上传类 随意选择一样你喜欢的上传方式 $logo_url = $tools->_upload_award("poll_img", $file, time());  $description = $_POST['description']; $total = $_POST['total']; $jump_url = $_POST['jump_url']; $token = getAccessToken();  //这里是我封装的一个获取 token的 方法 做了时间限制 防止超出调用次数   $Redpack = new addlotteryinfo_pub($token,SITE_URL.$logo_url);   $time = time();   $end = time()+60*24*60*60;//两个月 这里的开始和结束时间我固定了   $key = $Redpack->createNoncestr(); //key $Redpack->setParameter('title', $title);//活动标题$Redpack->setParameter('desc', $description);//活动描述$Redpack->setParameter('begin_time', $time);//开始时间$Redpack->setParameter('expire_time', $end); //结束时间$Redpack->setParameter('total', $total);//红包总数$Redpack->setParameter('jump_url', $jump_url);//key$Redpack->setParameter('key', $key);$result = $Redpack->hbpreorder();$result = (array)$result; if($result['errcode']==0){   $lottery_id = $result['lottery_id'];  $page_id = $result['page_id'];  //这里记得存一下数据库;           }else{  //echo '创建活动失败:'.$result['errmsg'];  //这里是错误提示}    

 2.预下单

接口说明

设置单个红包的金额,类型等,生成红包信息。预下单完成后,需要在72小时内调用jsapi完成抽红包的操作。(红包过期失效后,资金会退回到商户财付通帐号。)

接口调用说明

服务器端调用

http请求方式: POST

https://api.mch.weixin.qq.com/mmpaymkttransfers/hbpreorder

POST数据格式:XML

需要商户证书

请求参数说明

请求示例

                                                

返回数据说明

以下字段在return_code 和result_code都为SUCCESS的时候有返回

成功示例

        10010404   3    

失败示例

              10010404   3  /** * 摇一摇红包预下单  * @author jiosen */class Yhb_pub extends Wxpay_client_pub{  var $code;//code码,用以获取openid  var $openid;//用户的openid  function __construct()  {    //设置接口链接    $this->url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/hbpreorder";    //设置curl超时时间    $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;  }  /**   * 生成接口参数xml   */  function createXml()  {    try    {      //检测必填参数      if($this->parameters["mch_billno"] == null)      {        throw new SDKRuntimeException("缺少发红包接口必填参数mch_billno!"."
"); }elseif ($this->parameters["send_name"] == null ) { throw new SDKRuntimeException("缺少发红包接口必填参数send_name!"."
"); }elseif ($this->parameters["total_amount"] == null) { throw new SDKRuntimeException("缺少发红包接口必填参数total_amount!"."
"); }elseif ($this->parameters["total_num"] == null) { throw new SDKRuntimeException("缺少发红包接口必填参数total_num!"."
"); }elseif ($this->parameters["wishing"] == null) { throw new SDKRuntimeException("缺少发红包接口必填参数wishing!"."
"); }elseif ($this->parameters["act_name"] == null) { throw new SDKRuntimeException("缺少发红包接口必填参数act_name!"."
"); }elseif ($this->parameters["remark"] == null) { throw new SDKRuntimeException("缺少发红包接口必填参数remark!"."
"); } $this->parameters["wxappid"] = WxPayConf_pub::APPID;//公众账号ID $this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商户号 $this->parameters["nonce_str"] = $this->createNoncestr();//随机字符串 //$this->parameters["re_openid"] = $this->openid;//用户openid $this->parameters["hb_type"] = 'NORMAL';//红包类型 NORMAL-普通红包;GROUP-裂变红包(可分享红包给好友,无关注公众号能力)。 $this->parameters["auth_mchid"] = '1000052601';//摇周边商户号 $this->parameters["auth_appid"] = 'wxbf42bd79c4391863';//摇周边 appid $this->parameters["risk_cntl"] = 'NORMAL';//风控设置 $this->parameters["sign"] = $this->getSign($this->parameters);//签名 return $this->arrayToXml($this->parameters); }catch (SDKRuntimeException $e) { die($e->errorMessage()); } } function hbpreorder() { $this->postXmlSSL(); $this->result = $this->xmlToArray($this->response); return $this->result; } /** * 作用:生成可以获得code的url */ function createOauthUrlForCode($redirectUrl) { $urlObj["appid"] = WxPayConf_pub::APPID; $urlObj["redirect_uri"] = "$redirectUrl"; $urlObj["response_type"] = "code"; $urlObj["scope"] = "snsapi_base"; $urlObj["state"] = "STATE"."#wechat_redirect"; $bizString = $this->formatBizQueryParaMap($urlObj, false); return "https://open.weixin.qq.com/connect/oauth2/authorize?".$bizString; } /** * 作用:生成可以获得openid的url */ function createOauthUrlForOpenid() { $urlObj["appid"] = WxPayConf_pub::APPID; $urlObj["secret"] = WxPayConf_pub::APPSECRET; $urlObj["code"] = $this->code; $urlObj["grant_type"] = "authorization_code"; $bizString = $this->formatBizQueryParaMap($urlObj, false); return "https://api.weixin.qq.com/sns/oauth2/access_token?".$bizString; } /** * 作用:通过curl向微信提交code,以获取openid */ function getOpenid() { $url = $this->createOauthUrlForOpenid(); //初始化curl $ch = curl_init(); //设置超时 curl_setopt($ch, CURLOP_TIMEOUT, $this->curl_timeout); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE); curl_setopt($ch, CURLOPT_HEADER, FALSE); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); //运行curl,结果以jason形式返回 $res = curl_exec($ch); curl_close($ch); //取出openid $data = json_decode($res,true); $this->openid = $data['openid']; return $this->openid; } /** * 作用:设置code */ function setCode($code_) { $this->code = $code_; }}

 这里需要注意的是  auth_mchid 和 auth_appid 要填摇周边平台给出的appid 和商户号
 调用 (这里不贴前端页面了)

$Redpack = new \Yhb_pub();  $Redpack->setParameter('mch_billno', WxPayConf_pub::MCHID.date('YmdHis').rand(1000, 9999)); //商户名称 $Redpack->setParameter('send_name', "商户名称"); //付款金额 $Redpack->setParameter('total_amount', 100); //单位分 //红包发放总人数 $Redpack->setParameter('amt_type', "ALL_RAND"); $Redpack->setParameter('total_num', 1); //红包祝福语 $Redpack->setParameter('wishing', "摇一摇送红包"); //活动名称 $Redpack->setParameter('act_name', "摇一摇送红包"); //备注 $Redpack->setParameter('remark', "摇一摇送红包 备注"); $result = $Redpack->hbpreorder(); if($result[''])

 3.录入红包

接口说明

在调用"创建红包活动"接口之后,调用此接口录入红包信息。注意,此接口每次调用,都会向某个活动新增一批红包信息,如果红包数少于100 个,请通过一次调用添加所有红包信息。如果红包数大于100,可以多次调用接口添加。请注意确保多次录入的红包ticket总的数目不大于创建该红包活动 时设置的total值。

接口调用说明

 服务器端调用

http请求方式: POST
URL:https://api.weixin.qq.com/shakearound/lottery/setprizebucket?access_token=ACCESSTOKEN

请求参数说明


POST BODY:JSON格式的结构体

请求示例

 Content-Type: application/json Post Body:{   "lottery_id": "xxxxxxllllll",   "mchid": "10000098",   "sponsor_appid": "wx8888888888888888",  "prize_info_list": [        {        "ticket": "v1|ZiPs2l0hpMBp3uwGI1rwp45vOdz/V/zQ/00jP9MeWT+e47/q1FJjwCIP34frSjzOxAEzJ7k2CtAg1pmcShvkChBWqbThxPm6MBuzceoHtj79iHuHaEn0WAO+j4sXnXnbGswFOlDYWg1ngvrRYnCY3g=="   },   {  "ticket": "v1|fOhNUTap1oepSm5ap0hx1gmATM\/QX\/xn3sZWL7K+5Z10sbV5\/mZ4SwxwxbK2SPV32eLRvjd4ww1G3H5a+ypqRrySi+4oo97y63KoEQbRCPjbkyQBY8AYVyvD40V2b9slTQCm2igGY98mPe+VxZiayQ=="   }  ]}

返回数据说明

示例

 {   "errcode":0,   "errmsg":"",   "repeat_ticket_list":[        {      "ticket": "v1|ZiPs2l0hpMBp3uwGI1rwp45vOdz/V/zQ/00jP9MeWT+e47/q1FJjwCIP34frSjzOxAEzJ7k2CtAg1pmcShvkChBWqbThxPm6MBuzceoHtj79iHuHaEn0WAO+j4sXnXnbGswFOlDYWg1ngvrRYnCY3g=="   },   {"ticket":"v1|ZiPs2l0zzXCsdfwe45dxCdHiukOdz/V/zQ/89xcnC5XnT+e47/q1FJjwCO4frSjzOxAEzJ7k2CtAg1pmcShvkChBWzc45dDGC32Dcxx4DGxczjDCGsdjowe9iHuaEn0WAO+GswFOlDYWg1ngvrRYnCY3g=="     }      }  ], "success_num":100 }/** * 摇一摇红包 录入红包 * @author jiosen */class lottery_pub extends Wxpay_client_pub{  var $code;//code码,用以获取openid  var $openid;//用户的openid  function __construct($access_token)  {    //设置接口链接    $this->url = "https://api.weixin.qq.com/shakearound/lottery/setprizebucket?access_token=".$access_token;    //设置curl超时时间    $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;  }  /**   * 生成接口参数 json   */  function createJson()  {    try    {      //检测必填参数      if($this->parameters["lottery_id"] == null)      {        throw new SDKRuntimeException("缺少抽奖活动id lottery_id !"."
"); }else if(empty($this->parameters["prize_info_list"])){ throw new SDKRuntimeException("缺少抽奖活动红包 prize_info_list !"."
"); } $this->parameters["mchid"] = WxPayConf_pub::MCHID;//授权商户号 $this->parameters["sponsor_appid"] = WxPayConf_pub::APPID;//授权上号appid return json_encode($this->parameters); //echo json_encode($this->parameters);die; }catch (SDKRuntimeException $e) { die($e->errorMessage()); } } function setJsonArray($parameter, $parameterValue){ $this->parameters[$this->trimString($parameter)] = $parameterValue; } function hbpreorder() { $data = $this->createJson(); $result = $this->curl_post($this->url,$data); $result = json_decode($result); return $result; } function curl_post($url,$data) { $curl = curl_init($url); curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30); curl_setopt($curl, CURLOPT_TIMEOUT, 10); curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_POST, 1);//发送一个常规的Post请求 curl_setopt($curl, CURLOPT_POSTFIELDS, $data);//Post提交的数据包 $rv = curl_exec($curl);//输出内容 curl_close($curl); return $rv; } /** * 作用:生成可以获得code的url */ function createOauthUrlForCode($redirectUrl) { $urlObj["appid"] = WxPayConf_pub::APPID; $urlObj["redirect_uri"] = "$redirectUrl"; $urlObj["response_type"] = "code"; $urlObj["scope"] = "snsapi_base"; $urlObj["state"] = "STATE"."#wechat_redirect"; $bizString = $this->formatBizQueryParaMap($urlObj, false); return "https://open.weixin.qq.com/connect/oauth2/authorize?".$bizString; } /** * 作用:生成可以获得openid的url */ function createOauthUrlForOpenid() { $urlObj["appid"] = WxPayConf_pub::APPID; $urlObj["secret"] = WxPayConf_pub::APPSECRET; $urlObj["code"] = $this->code; $urlObj["grant_type"] = "authorization_code"; $bizString = $this->formatBizQueryParaMap($urlObj, false); return "https://api.weixin.qq.com/sns/oauth2/access_token?".$bizString; } /** * 作用:通过curl向微信提交code,以获取openid */ function getOpenid() { $url = $this->createOauthUrlForOpenid(); //初始化curl $ch = curl_init(); //设置超时 curl_setopt($ch, CURLOP_TIMEOUT, $this->curl_timeout); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE); curl_setopt($ch, CURLOPT_HEADER, FALSE); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); //运行curl,结果以jason形式返回 $res = curl_exec($ch); curl_close($ch); //取出openid $data = json_decode($res,true); $this->openid = $data['openid']; return $this->openid; } /** * 作用:设置code */ function setCode($code_) { $this->code = $code_; }}

 调用


    $token = getAccessToken();
    $Redpack = new \lottery_pub($token);
    $lottery_id = ''; //这里读取数据库取出创建活动时返回的 lottery_id $Redpack->setParameter('lottery_id', $lottery_id); //活动id $prize_info_list =array(array('ticket'=>'这里取出预下单返回的sp_ticket')); $Redpack->setJsonArray('prize_info_list', $prize_info_list); //提交 $Redpack->hbpreorder();

抢红包页面  php

function getshakeinfo($access_token,$ticket){    $getshakeinfourl='https://api.weixin.qq.com/shakearound/user/getshakeinfo?access_token='.$access_token;     $jo=0;     if($access_token){      $data=array('ticket' =>$ticket);      $rd=$this->curl_post($getshakeinfourl,json_encode($data));      $jo=json_decode($rd);     }else{      echo 'access_token null';     }     return $jo;  }    $ticket=$_GET['ticket'];//获ㄉ璞感畔 U UID 、 major 、 minor ,以及距离、 openID 等信息    $token = getAccessToken();    $shake=getshakeinfo($token,$ticket);    $openid=$shake->data->openid;    $jsapi = new Common_util_pub();     $noncestr = $jsapi->createNoncestr();    $parameters = array(        'lottery_id' =>'创建活动时候返回的活动ID',        'noncestr'=>$noncestr,        'openid'=>$openid,      );    $signStr = $jsapi->formatBizQueryParaMap($parameters,false);    $key = '创建活动时候的key';    $signStr=$signStr."&key=".$key;    $sign = strtoupper(md5($signStr));

 上一步返回的参数填在抢红包html页面

 

红包绑定用户事件通知     

接口说明

用户进入红包页面时,后台会将一个红包ticket和用户openid绑定,微信会把这个事件推送到开发者填写的URL(登录公众平台进入开发者中心设置)。推送内容包含用户openid,红包活动id,红包ticket、金额以及红包绑定时间。
 注:红包绑定用户不等同于用户领取红包。用户进入红包页面后,有可能不拆红包,但该红包ticket已被绑定,不能再被其他用户绑定,过期后会退回商户财付通账户。

推送XML数据包示例

   1442824314     88 1442824313  

 添加事件处理即可

/**   * 事件处理   * @param unknown $object   * @return string   */  public function handleEvent($object) {    // Event是事件类型(subscribe,LOCATION)    $oneEvent = $object->Event;    // EventKey是菜单事件的key值    $key = $object->EventKey;    // 关注事件    if ($oneEvent == "subscribe" || $oneEvent == "SCAN") {      if(!empty($object->Ticket)) {        //扫码事件        ....      } else {        //关注事件        ....      }    }else if($oneEvent=="ShakearoundLotteryBind"){      //添加到数据库    }else if.......其他的事件......  }

 完毕了.时间比较匆忙 也没时间做优化 大神经过顺便指导12  我好搓的英文基础

下面贴上完整WxPayPubHelper 集成了所有支付类 配置可用

 $v)    {      if($urlencode)      {        $v = urlencode($v);      }      //$buff .= strtolower($k) . "=" . $v . "&";      $buff .= $k . "=" . $v . "&";    }    $reqPar;    if (strlen($buff) > 0)     {      $reqPar = substr($buff, 0, strlen($buff)-1);    }    return $reqPar;  }  /**   * 作用:生成签名   */  public function getSign($Obj)  {    foreach ($Obj as $k => $v)    {      $Parameters[$k] = $v;    }    //签名步骤一:按字典序排序参数    ksort($Parameters);    $String = $this->formatBizQueryParaMap($Parameters, false);    //echo '【string1】'.$String.'
'; //签名步骤二:在string后加入KEY $String = $String."&key=".WxPayConf_pub::KEY; //echo "【string2】".$String."
"; //签名步骤三:MD5加密 $String = md5($String); //echo "【string3】 ".$String."
"; //签名步骤四:所有字符转为大写 $result_ = strtoupper($String); //echo "【result】 ".$result_."
"; return $result_; } /** * 作用:array转xml */ function arrayToXml($arr) { $xml = ""; foreach ($arr as $key=>$val) { if (is_numeric($val)) { $xml.="<".$key.">".$val.""; } else $xml.="<".$key.">"; } $xml.=""; return $xml; } /** * 作用:将xml转为array */ public function xmlToArray($xml) { //将XML转为array $array_data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true); return $array_data; } /** * 作用:以post方式提交xml到对应的接口url */ public function postXmlCurl($xml,$url,$second=30) { //初始化curl $ch = curl_init(); //设置超时 curl_setopt($ch, CURLOP_TIMEOUT, $second); //这里设置代理,如果有的话 //curl_setopt($ch,CURLOPT_PROXY, '8.8.8.8'); //curl_setopt($ch,CURLOPT_PROXYPORT, 8080); curl_setopt($ch,CURLOPT_URL, $url); curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE); //设置header curl_setopt($ch, CURLOPT_HEADER, FALSE); //要求结果为字符串且输出到屏幕上 curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); //post提交方式 curl_setopt($ch, CURLOPT_POST, TRUE); curl_setopt($ch, CURLOPT_POSTFIELDS, $xml); //运行curl $data = curl_exec($ch); curl_close($ch); //返回结果 if($data) { curl_close($ch); return $data; } else { $error = curl_errno($ch); echo "curl出错,错误码:$error"."
"; echo "错误原因查询
"; curl_close($ch); return false; } } /** * 作用:使用证书,以post方式提交xml到对应的接口url */ function postXmlSSLCurl($xml,$url,$second=30) { $ch = curl_init(); //超时时间 curl_setopt($ch,CURLOPT_TIMEOUT,$second); //这里设置代理,如果有的话 //curl_setopt($ch,CURLOPT_PROXY, '8.8.8.8'); //curl_setopt($ch,CURLOPT_PROXYPORT, 8080); curl_setopt($ch,CURLOPT_URL, $url); curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE); //设置header curl_setopt($ch,CURLOPT_HEADER,FALSE); //要求结果为字符串且输出到屏幕上 curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE); //设置证书 //使用证书:cert 与 key 分别属于两个.pem文件 //默认格式为PEM,可以注释// curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');// curl_setopt($ch,CURLOPT_SSLCERT,WxPayConf_pub::SSLCERT_PATH );// //默认格式为PEM,可以注释// curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');// curl_setopt($ch,CURLOPT_SSLKEY, WxPayConf_pub::SSLKEY_PATH); curl_setopt($ch, CURLOPT_SSLCERT,WxPayConf_pub::SSLCERT_PATH); curl_setopt($ch, CURLOPT_SSLKEY,WxPayConf_pub::SSLKEY_PATH); curl_setopt($ch, CURLOPT_CAINFO, WxPayConf_pub::SSLCA_PATH); // CA根证书(用来验证的网站证书是否是CA颁布) //post提交方式 curl_setopt($ch,CURLOPT_POST, true); curl_setopt($ch,CURLOPT_POSTFIELDS,$xml); $data = curl_exec($ch); //返回结果 if($data){ curl_close($ch); return $data; } else { $error = curl_errno($ch); echo "curl出错,错误码:$error"."
"; echo "错误原因查询
"; curl_close($ch); return false; } } /** * 作用:打印数组 */ function printErr($wording='',$err='') { print_r('
');    echo $wording."
"; var_dump($err); print_r('
'); }}/** * 请求型接口的基类 */class Wxpay_client_pub extends Common_util_pub { var $parameters;//请求参数,类型为关联数组 public $response;//微信返回的响应 public $result;//返回参数,类型为关联数组 var $url;//接口链接 var $curl_timeout;//curl超时时间 /** * 作用:设置请求参数 */ function setParameter($parameter, $parameterValue) { $this->parameters[$this->trimString($parameter)] = $this->trimString($parameterValue); } /** * 作用:设置标配的请求参数,生成签名,生成接口参数xml */ function createXml() { $this->parameters["appid"] = WxPayConf_pub::APPID;//公众账号ID $this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商户号 $this->parameters["nonce_str"] = $this->createNoncestr();//随机字符串 $this->parameters["sign"] = $this->getSign($this->parameters);//签名 return $this->arrayToXml($this->parameters); } /** * 作用:post请求xml */ function postXml() { $xml = $this->createXml(); $this->response = $this->postXmlCurl($xml,$this->url,$this->curl_timeout); return $this->response; } /** * 作用:使用证书post请求xml */ function postXmlSSL() { $xml = $this->createXml(); $this->response = $this->postXmlSSLCurl($xml,$this->url,$this->curl_timeout); return $this->response; } /** * 作用:获取结果,默认不使用证书 */ function getResult() { $this->postXml(); $this->result = $this->xmlToArray($this->response); return $this->result; }}/** * 统一支付接口类 */class UnifiedOrder_pub extends Wxpay_client_pub{ function __construct() { //设置接口链接 $this->url = "https://api.mch.weixin.qq.com/pay/unifiedorder"; //设置curl超时时间 $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT; } /** * 生成接口参数xml */ function createXml() { try { //检测必填参数 if($this->parameters["out_trade_no"] == null) { throw new SDKRuntimeException("缺少统一支付接口必填参数out_trade_no!"."
"); }elseif($this->parameters["body"] == null){ throw new SDKRuntimeException("缺少统一支付接口必填参数body!"."
"); }elseif ($this->parameters["total_fee"] == null ) { throw new SDKRuntimeException("缺少统一支付接口必填参数total_fee!"."
"); }elseif ($this->parameters["notify_url"] == null) { throw new SDKRuntimeException("缺少统一支付接口必填参数notify_url!"."
"); }elseif ($this->parameters["trade_type"] == null) { throw new SDKRuntimeException("缺少统一支付接口必填参数trade_type!"."
"); }elseif ($this->parameters["trade_type"] == "JSAPI" && $this->parameters["openid"] == NULL){ throw new SDKRuntimeException("统一支付接口中,缺少必填参数openid!trade_type为JSAPI时,openid为必填参数!"."
"); } $this->parameters["appid"] = WxPayConf_pub::APPID;//公众账号ID $this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商户号 $this->parameters["spbill_create_ip"] = $_SERVER['REMOTE_ADDR'];//终端ip $this->parameters["nonce_str"] = $this->createNoncestr();//随机字符串 $this->parameters["sign"] = $this->getSign($this->parameters);//签名 return $this->arrayToXml($this->parameters); }catch (SDKRuntimeException $e) { die($e->errorMessage()); } } /** * 获取prepay_id */ function getPrepayId() { $this->postXml(); $this->result = $this->xmlToArray($this->response); $prepay_id = $this->result["prepay_id"]; return $prepay_id; }}/** * 订单查询接口 */class OrderQuery_pub extends Wxpay_client_pub{ function __construct() { //设置接口链接 $this->url = "https://api.mch.weixin.qq.com/pay/orderquery"; //设置curl超时时间 $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT; } /** * 生成接口参数xml */ function createXml() { try { //检测必填参数 if($this->parameters["out_trade_no"] == null && $this->parameters["transaction_id"] == null) { throw new SDKRuntimeException("订单查询接口中,out_trade_no、transaction_id至少填一个!"."
"); } $this->parameters["appid"] = WxPayConf_pub::APPID;//公众账号ID $this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商户号 $this->parameters["nonce_str"] = $this->createNoncestr();//随机字符串 $this->parameters["sign"] = $this->getSign($this->parameters);//签名 return $this->arrayToXml($this->parameters); }catch (SDKRuntimeException $e) { die($e->errorMessage()); } }}/** * 退款申请接口 */class Refund_pub extends Wxpay_client_pub{ function __construct() { //设置接口链接 $this->url = "https://api.mch.weixin.qq.com/secapi/pay/refund"; //设置curl超时时间 $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT; } /** * 生成接口参数xml */ function createXml() { try { //检测必填参数 if($this->parameters["out_trade_no"] == null && $this->parameters["transaction_id"] == null) { throw new SDKRuntimeException("退款申请接口中,out_trade_no、transaction_id至少填一个!"."
"); }elseif($this->parameters["out_refund_no"] == null){ throw new SDKRuntimeException("退款申请接口中,缺少必填参数out_refund_no!"."
"); }elseif($this->parameters["total_fee"] == null){ throw new SDKRuntimeException("退款申请接口中,缺少必填参数total_fee!"."
"); }elseif($this->parameters["refund_fee"] == null){ throw new SDKRuntimeException("退款申请接口中,缺少必填参数refund_fee!"."
"); }elseif($this->parameters["op_user_id"] == null){ throw new SDKRuntimeException("退款申请接口中,缺少必填参数op_user_id!"."
"); } $this->parameters["appid"] = WxPayConf_pub::APPID;//公众账号ID $this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商户号 $this->parameters["nonce_str"] = $this->createNoncestr();//随机字符串 $this->parameters["sign"] = $this->getSign($this->parameters);//签名 return $this->arrayToXml($this->parameters); }catch (SDKRuntimeException $e) { die($e->errorMessage()); } } /** * 作用:获取结果,使用证书通信 */ function getResult() { $this->postXmlSSL(); $this->result = $this->xmlToArray($this->response); return $this->result; }}/** * 退款查询接口 */class RefundQuery_pub extends Wxpay_client_pub{ function __construct() { //设

  • 上一条:
    基于PHP实现简单的随机抽奖小程序
    下一条:
    weiphp微信公众平台授权设置
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 微信模板消息改版后发送规则记录(微信订阅消息参数值内容限制说明)(1个评论)
    • 微信支付v3对接所需工具及命令(0个评论)
    • 2023年9月1日起:微信小程序必须备案才能上线运营(0个评论)
    • 腾讯官方客服回应了:微信好友上限约10000个!(1个评论)
    • 2023年做微信小程序的老铁注意:新增收费项、微信小程序获取手机号也收费了(2个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2017-10
    • 2018-01
    • 2020-03
    • 2021-06
    • 2021-10
    • 2022-03
    • 2023-02
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-10
    • 2023-11
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客