您的位置:首页 > 移动开发 > 微信开发

微信企业红包开发(php)

2015-05-18 01:17 691 查看
微信的开发真的有点麻烦,不是难,就是烦,细节多,东西多,关联多

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

申请:这里只说简单的过程

先申请公众服务号
在服务号中申请‘微信支付’(登录公众号平台首页左面有这个菜单),觉得微信在推广移动支付,所以还是很好申请的,关于申请中填写的网站最好做一个购买的演示链接,这样可能更容易下来。

证书

微信支付申请下来了,那么你有了一个 微信的 商户号和登录密码 (会发邮件给你)
还是从申请微信支付哪里 点到 微信商户登录页面
进去先看 [账户管理]设置证书 安装证书 设置证书的 api秘钥(这个是开发的签名key 自己保存好) 然后下载开发用的证书,反正都在这个大菜单里
下载了证书 放到一个安全点的目录(我是用php开发 linux环境,和window可能有点小区别) 注意这个目录不要是 web服务的目录 不然被别人下载了 呵呵。。

开发代码整理

老规矩直接找别人的代码,找到一个看起来靠谱的,尼玛 6个文件。。。说真的 看demo的时候 我特别讨厌 封装
下面是我自己整理的代码,实际测试ok的时间 不足整理时间的 十分之一 再次无语(不过还是要谢谢 放代码的兄弟)
注意 所有方法全要 放一个php 类里就可以了 GrantHongbao是入口方法 下面的参数自己换一下
注意 证书目录 替换成你 保存证书的目录
</pre></li></ul></ol></p><pre name="code" 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 = 'https://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;

}

}

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: