首页 > 编程 > PHP > 正文

微信企业红包开发(php)

2020-03-22 18:27:43
字体:
来源:转载
供稿:网友
  • 微信的开发真的有点麻烦,不是难,就是烦,细节多,东西多,关联多

    这里记录下 微信企业红包开发的整个过程(弄完的话 微信支付 也差不多了,代码是 php的)

    申请:这里只说简单的过程先申请公众服务号在服务号中申请‘微信支付’(登录公众号平台首页左面有这个菜单),觉得微信在推广移动支付,所以还是很好申请的,关于申请中填写的网站最好做一个购买的演示链接,这样可能更容易下来。证书微信支付申请下来了,那么你有了一个 微信的 商户号和登录密码 (会发邮件给你)还是从申请微信支付哪里 点到 微信商户登录页面进去先看 [账户管理]设置证书 安装证书 设置证书的 api秘钥(这个是开发的签名key 自己保存好) 然后下载开发用的证书,反正都在这个大菜单里下载了证书 放到一个安全点的目录(我是用php开发 linux环境,和window可能有点小区别) 注意这个目录不要是 web服务的目录 不然被别人下载了 呵呵。。开发代码整理老规矩直接找别人的代码,找到一个看起来靠谱的,尼玛 6个文件。。。说真的 看demo的时候 我特别讨厌 封装下面是我自己整理的代码,实际测试ok的时间 不足整理时间的 十分之一 再次无语(不过还是要谢谢 放代码的兄弟)注意 所有方法全要 放一个php 类里就可以了 GrantHongbao是入口方法 下面的参数自己换一下注意 证书目录 替换成你 保存证书的目录
    </pre></li></ul></ol></p><pre name="code" html' target='_blank'>class="plain">
    public function GrantHongbao(){//发送红包

    $PARTNERKEY = C('WEIXINPAYAPIKEY'); //商户的签名加密key
    $APPMCHID = C('WEIXINMCHID'); //微信商户号
    $WEIXINAPPID = C('WEIXINAPPID'); //微信的appid
    $BILLNO = $this->app_mchid.date('YmdHis').rand(1000, 9999); //订单号

    $openid = C('KKOPENID'); //收红包的人的openid

    $acount = 100; //发放的金额(单位分)

    $url = 'http://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack'; //api url

    $ip = '101.45.174.67'; //本机ip

    $parames = array();


    $parames["nonce_str"] = $this->great_rand();//随机字符串,丌长于 32 位
    $parames["mch_billno"] = $BILLNO;//订单号

    $parames["mch_id"] = $APPMCHID;//商户号
    $parames["wxappid"] = $WEIXINAPPID;

    $parames["nick_name"] = '红包nick_name';//提供方名称
    $parames["send_name"] = 'KK';//红包发送者名称
    $parames["re_openid"] = $openid;//openid

    $parames["total_amount"] = $acount;//付款金额,单位分
    $parames["min_value"] = $acount;//最小红包金额,单位分
    $parames["max_value"] = $acount;//最大红包金额,单位分
    $parames["total_num"] = 1;//红包収放总人数

    $parames["wishing"] = '发个红包真不容易...';//红包祝福

    $parames["client_ip"] = $ip;//调用接口的机器 Ip 地址

    $parames["act_name"] = 'kk测试红包';//活劢名称

    $parames["remark"] = '快来抢!(没了别来了)';//

    $parames["sign"] = $this->get_sign($parames, $PARTNERKEY);//参数签名


    //var_dump($parames);

    //转成xml字符串
    $postXml = $this->array2Xmlstring($parames);



    //echo '<br>';
    //var_dump($postXml);

    //向微信老大发起请求
    $responseXml = $this->curl_post_ssl($url, $postXml);

    //echo '<br>$responseXml<br>';
    var_dump($responseXml);


    $responseObj = simplexml_load_string($responseXml, 'SimpleXMLElement', LIBXML_NOCDATA);

    echo $responseObj->return_code;


    }

    /**
    *获取参数列表的签名
    * @param type $parameters
    * @param type $PARTNERKEY:签名的秘钥
    * @return type
    */
    protected function get_sign($parameters, $PARTNERKEY){

    //字典排序
    ksort($parameters);

    $unSignParaString = $this->formatQueryParaMap($parameters, false);
    //要签名的字符串
    $signStr = $unSignParaString . "&key=" . $PARTNERKEY;

    return strtoupper(md5($signStr));


    }
    /**
    *将参数列表转化为连接字符串
    * @param type $paraMap
    * @param type $urlencode
    * @return type
    */
    protected function formatQueryParaMap($paraMap, $urlencode){
    $buff = "";
    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;
    }
    /**
    *生成随机数(默认30位长度)
    * @return string
    */
    protected function great_rand($length = 30){
    $str = '1234567890abcdefghijklmnopqrstuvwxyz';
    for($i=0;$i<$length;$i++){
    $j=rand(0,35);
    $t1 .= $str[$j];
    }
    return $t1;
    }
    /**
    *数组转xml串
    * @param type $arr
    * @return string
    */
    protected function array2Xmlstring($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;
    }
    /**
    * 访问微信接口
    * @param type $url
    * @param type $vars
    * @param type $second
    * @param type $aHeader
    * @return boolean
    */
    protected 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文件
    curl_setopt($ch,CURLOPT_SSLCERT,'证书保存路径'.'apiclient_cert.pem');
    curl_setopt($ch,CURLOPT_SSLKEY,'证书保存路径'.'apiclient_key.pem');
    curl_setopt($ch,CURLOPT_CAINFO,'证书保存路径'.'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);
    curl_close($ch);
    return $error;
    }
    }
    PHP编程        

    郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

  • 发表评论 共有条评论
    用户名: 密码:
    验证码: 匿名发表