微信的開發真的有點麻煩,不是難,就是煩,細節多,東西多,關聯多
這裏記錄下 微信企業紅包開發的整個過程(弄完的話 微信支付 也差不多了,代碼是 php的)
- 申請:這裏只說簡單的過程
- 先申請公衆服務號
- 在服務號中申請‘微信支付’(登錄公衆號平臺首頁左面有這個菜單),覺得微信在推廣移動支付,所以還是很好申請的,關於申請中填寫的網站最好做一個購買的演示鏈接,這樣可能更容易下來。
- 證書
- 微信支付申請下來了,那麼你有了一個 微信的 商戶號和登錄密碼 (會發郵件給你)
- 還是從申請微信支付哪裏 點到 微信商戶登錄頁面
- 進去先看 [賬戶管理]設置證書 安裝證書 設置證書的 api祕鑰(這個是開發的簽名key 自己保存好) 然後下載開發用的證書,反正都在這個大菜單裏
- 下載了證書 放到一個安全點的目錄(我是用php開發 linux環境,和window可能有點小區別) 注意這個目錄不要是 web服務的目錄 不然被別人下載了 呵呵。。
- 開發代碼整理
- 老規矩直接找別人的代碼,找到一個看起來靠譜的,尼瑪 6個文件。。。說真的 看demo的時候 我特別討厭 封裝
- 下面是我自己整理的代碼,實際測試ok的時間 不足整理時間的 十分之一 再次無語(不過還是要謝謝 放代碼的兄弟)
- 注意 所有方法全要 放一個php 類裏就可以了 GrantHongbao是入口方法 下面的參數自己換一下
- 注意 證書目錄 替換成你 保存證書的目錄
public function GrantHongbao(){ //發送紅包</pre></li></ul></ol></p><pre name="code" class="plain">
$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;
}
}