微信企业红包开发(php)
2015-05-18 01:17
691 查看
微信的开发真的有点麻烦,不是难,就是烦,细节多,东西多,关联多
这里记录下 微信企业红包开发的整个过程(弄完的话 微信支付 也差不多了,代码是 php的)
申请:这里只说简单的过程
先申请公众服务号
在服务号中申请‘微信支付’(登录公众号平台首页左面有这个菜单),觉得微信在推广移动支付,所以还是很好申请的,关于申请中填写的网站最好做一个购买的演示链接,这样可能更容易下来。
证书
微信支付申请下来了,那么你有了一个 微信的 商户号和登录密码 (会发邮件给你)
还是从申请微信支付哪里 点到 微信商户登录页面
进去先看 [账户管理]设置证书 安装证书 设置证书的 api秘钥(这个是开发的签名key 自己保存好) 然后下载开发用的证书,反正都在这个大菜单里
下载了证书 放到一个安全点的目录(我是用php开发 linux环境,和window可能有点小区别) 注意这个目录不要是 web服务的目录 不然被别人下载了 呵呵。。
开发代码整理
老规矩直接找别人的代码,找到一个看起来靠谱的,尼玛 6个文件。。。说真的 看demo的时候 我特别讨厌 封装
下面是我自己整理的代码,实际测试ok的时间 不足整理时间的 十分之一 再次无语(不过还是要谢谢 放代码的兄弟)
注意 所有方法全要 放一个php 类里就可以了 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;
}
}
这里记录下 微信企业红包开发的整个过程(弄完的话 微信支付 也差不多了,代码是 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;
}
}
相关文章推荐
- 微信开发 -- 企业付款 PHP代码实现
- 公众号发红包接口开发demo,php开发微信现金红包api接口
- PHP微信公众号开发之微信红包实现方法分析
- 微信公众号微信红包开发 PHP代码
- 微信开发 -- 企业付款 PHP代码实现
- 微信企业付款api开发,php开发公众号企业付款demo
- 微信开发 -- 企业付款 PHP代码实现
- PHP开发的微信现金红包功能示例
- php 微信商户发红包,退款,订单查询,企业付款到零钱
- 微信红包店小程序开发过程中遇到的问题 php获取附近周边商家 显示最近商家
- PHP实现微信开发中提现功能(企业付款到用户零钱)
- 微信企业红包开发签名一样一直提示签名错误的解决办法
- 企业微信开发之发放企业红包(C#)
- 微信开发 现金红包、裂变红包、企业付款
- PHP微信开发之文本自动回复
- Java企业微信开发_Exception_02_java.security.InvalidKeyException: Illegal key size
- php微信公众账号开发之五个坑(二)
- PHP 调用微信JS-SDK 开发详解 [网摘]
- 【微信开发】-- 企业转账到用户