PHP实现微信发红包功能

//核心支付函数,
function pay($url,$obj) {
    $obj['nonce_str'] = create_noncestr();  //创建随机字符串
    $stringA = create_qianming($obj,false);  //创建签名
    $stringSignTemp = $stringA."&key='微信支付平台的key'";  //签名后加api
    $sign = strtoupper(md5($stringSignTemp));  //签名加密并大写
    $obj['sign'] = $sign;  //将签名传入数组
    $postXml = arrayToXml($obj);  //将参数转为xml格式
    $responseXml = 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 = "";
    foreach ($arr as $key=>$val) {
        if (is_numeric($val)) {
            $xml.="<".$key.">".$val.".$key.">";
        } else {
            $xml.="<".$key.">.$val."]]>.$key.">";
        }
    }
    $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文件,路径写绝对路径
    curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
    curl_setopt($ch,CURLOPT_SSLCERT, '/home/ubuntu/hbtest/Skyworth/Common/Common/apiclient_cert.pem');
    //默认格式为PEM,可以注释
    curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
    curl_setopt($ch,CURLOPT_SSLKEY,'/home/ubuntu/hbtest/Skyworth/Common/Common/apiclient_key.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;
    }
}
微信红包调用测试代码
1.发放红包接口:
public function sendredpack()
{
        $money = 100; //最低1元,单位分
        $sender = "商家测试";
        $obj2 = array();
        $obj2['wxappid'] = "wxa96edae233333b808"; //appid
        $obj2['mch_id'] = "1366666666";
        $obj2['mch_billno'] = date('YmdHis').rand(1000,9999);
        $obj2['client_ip'] = $_SERVER['REMOTE_ADDR'];
        $obj2['re_openid'] = "oJCEAwzHnasdfP74_HZ5t7A0";
        $obj2['total_amount'] = $money;
        $obj2['total_num'] = 1;
        $obj2['send_name'] = $sender;
        $obj2['wishing'] = "恭喜发财";
        $obj2['act_name'] = $sender."红包";
        $obj2['remark'] = $sender."红包";
        $url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack";
        $res = pay($url, $obj2);
}
2.发放裂变红包:
public function sendgroupredpack()
{
        $money = 300; //最低1元,单位分
        $sender = "商家测试";
        $obj2 = array();
        $obj2['wxappid'] = "wxa9256edaea66666"; //appid
        $obj2['mch_id'] = "13350877761";
        $obj2['mch_billno'] = "13350877761".date('YmdHis').rand(1000,9999);
        $obj2['re_openid'] = "oJCEAwzHnmMwP74weruft7A0";
        $obj2['total_amount'] = $money;
        $obj2['total_num'] = 3;//最小为3
        $obj2['amt_type'] = "ALL_RAND";
        $obj2['send_name'] = $sender;
        $obj2['wishing'] = "恭喜发财";
        $obj2['act_name'] = $sender."红包";
        $obj2['remark'] = $sender."红包";
        $url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendgroupredpack";
        $res = pay($url, $obj2);
}

你可能感兴趣的:(微信)