微信小程序?qū)崿F(xiàn)紅包功能(后端PHP實現(xiàn)邏輯)
本文為大家分享了微信小程序紅包功能的具體代碼,供大家參考,具體內(nèi)容如下
首先說明一點:微信小程序紅包功能一定記得用企業(yè)付款到錢包功能,別用微信的現(xiàn)金紅包接口,否則你就有踩不完的坑。
直接上代碼了
微信小程序代碼:
index.js
//搶紅包相關(guān) view_moneysure: function () { var that = this; wx.request({ url: app.globalData.baseurl +'api/wxopen/applet/grab',//這個鏈接是后端寫的 header: { 'Content-Type': 'application/x-www-form-urlencoded' }, data: { openid: app.globalData.openid, auth: app.globalData.pcUserInfo.auth }, method: 'POST', success: function (response) { console.log(response); if (response.data.status==1){ that.setData({ paymsg: response.data.total_amount+'元\n現(xiàn)金紅包', paymsg2: '恭喜您\n成功領(lǐng)取下單紅包獎勵' }) }else{ that.setData({ paymsg: '領(lǐng)取失敗\n'+response.data.msg, paymsg2: '非常抱歉\n如不不明,請聯(lián)系客服' }) } }, fail: function (res) { console.log(response); that.setData({ paymsg: '領(lǐng)取失敗' }) } }) }, showHb: function () { this.setData({ showFlag: 1 }) }, openHb: function () { this.setData({ paymsg: '', paymsg2: '' }) this.view_moneysure() var _self = this; _self.setData({ _num: 1 }) setTimeout(function () { _self.setData({ _num: 0, showFlag: 0, bghide: 1 }) }, 1000) }, closeHb:function(){ this.setData({ bghide:0 }) },
wxml代碼:
<button class="btn" bindtap="showHb">領(lǐng)紅包</button> <view class="draw-list {{showFlag == 1? 'active':''}}"> <image bindtap="openHb" class="{{_num==1?'active':''}}" src="http://www.17sucai.com/preview/1/2017-11-02/hb/image/open.png"></image> </view> <view id="receive1" class="win1 {{bghide==1?'active':''}}"> <view class="openhb {{bghide==1?'active':''}}"> <view class="winBody2"> <view class="receive1-bg1"> <view class="receive1-head"> <text>{{paymsg}}</text> </view> <view class="receive1-body"><text>{{paymsg2}}</text></view> <button class="receive1-but1" bindtap="closeHb">確定</button> <view class="receive1-bg2"></view> </view> </view> </view> </view>
PHP代碼:
/* * 企業(yè)付款到零錢 **/ public function weixin_pay_person($re_openid) { $obj = new WxopenWechatService(); // 請求參數(shù) $data['mch_appid'] = WxopenWechatConfig::$init_config_applet['appid'];//商戶號 $data['mchid'] = WxopenWechatConfig::$compay_config['mch_id'];//商戶賬號appid $data['nonce_str'] = $this->get_unique_value();// 隨機字符串 //商戶訂單號,可以按要求自己組合28位的商戶訂單號 $data['partner_trade_no'] = $this->get_tradeno($data['mchid']); $data['openid'] = $re_openid;//用戶openid $data['check_name'] = 'NO_CHECK';//校驗用戶姓名選項 $data['amount'] = '100';//金額,單位為分 $data['desc'] = "恭喜你得到一個紅包";//企業(yè)付款描述信息 $data['spbill_create_ip'] = $obj->get_client_ip();//IP地址 $appsecret = WxopenWechatConfig::$compay_config['key']; $data['sign'] = $this->sign($data, $appsecret); //發(fā)紅包接口地址 $url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers"; //將請求數(shù)據(jù)由數(shù)組轉(zhuǎn)換成xml $xml = $this->arraytoxml($data); //進行請求操作 $res = $this->curl($xml, $url); //將請求結(jié)果由xml轉(zhuǎn)換成數(shù)組 $arr = $this->xmltoarray($res); if (is_array($arr)) { $arr['total_amount'] = $data['amount']; } //請請求信息和請求結(jié)果錄入到數(shù)據(jù)庫中 // 輸出請求結(jié)果數(shù)組 return $arr; } public function create_rand_money($start = 30, $end = 100) { return mt_rand($start, $end); } public function sign($params, $appsecret) { ksort($params); $beSign = array_filter($params, 'strlen'); $pairs = array(); foreach ($beSign as $k => $v) { $pairs[] = "$k=$v"; } $sign_data = implode('&', $pairs); $sign_data .= '&key=' . $appsecret; return strtoupper(md5($sign_data)); } /* * 生成32位唯一隨機字符串 **/ private function get_unique_value() { $str = uniqid(mt_rand(), 1); $str = sha1($str); return md5($str); } /* * 將數(shù)組轉(zhuǎn)換成xml **/ private function arraytoxml( $arr ) { $xml = "<xml>"; foreach ($arr as $k => $v) { $xml .= "<" . $k . ">" . $v . "</" . $k . ">"; } $xml .= "</xml>"; return $xml; } /* * 將xml轉(zhuǎn)換成數(shù)組 **/ private function xmltoarray( $xml ) { //禁止引用外部xml實體 libxml_disable_entity_loader(true); $xmlstring = simplexml_load_string($xml, "SimpleXMLElement", LIBXML_NOCDATA); $arr = json_decode(json_encode($xmlstring), true); return $arr; } /* * 進行curl操作 **/ private function curl( $param = "", $url ) { $postUrl = $url; $curlPost = $param; //初始化curl $ch = curl_init(); //抓取指定網(wǎng)頁 curl_setopt($ch, CURLOPT_URL, $postUrl); //設置header curl_setopt($ch, CURLOPT_HEADER, 0); //要求結(jié)果為字符串且輸出到屏幕上 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //post提交方式 curl_setopt($ch, CURLOPT_POST, 1); // 增加 HTTP Header(頭)里的字段 curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost); // 終止從服務端進行驗證 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); //這個是證書的位置 curl_setopt($ch, CURLOPT_SSLCERT, __DIR__ . '/cert/apiclient_cert.pem'); //這個也是證書的位置 curl_setopt($ch, CURLOPT_SSLKEY, __DIR__ . '/cert/apiclient_key.pem'); //運行curl $data = curl_exec($ch); //關(guān)閉curl curl_close($ch); return $data; } public function get_tradeno($str) { return $str . date("Ymd", time()) . date("His", time()) . rand(1111, 9999); }
別人總結(jié)的相當寶貴的踩坑經(jīng)驗:
1、紅包是以分為單位,必須大于100分,小于20000分之間。
2、用戶無需關(guān)注你的公眾號(或服務號,下同),如果關(guān)注了你的公眾號,紅包會通過公眾號發(fā)送,如果沒有,通過服務通知發(fā)送。
3、接口中的訂單號由“微信支付商戶號+4位年+2為月份+2位日期+10位一天內(nèi)不能重復的數(shù)字”,這個一天是自然日。
4、目前不支持發(fā)送隨機紅包,因此接口中提交的字段min_value、max_value、total_amount這3個值大小必須一樣,total_num值必須為1.
5、隨機紅包可以自己的程序?qū)崿F(xiàn),在100~20000隨機出一個數(shù)值,然后給上面3個值設定這個隨機結(jié)果。
6、活動名稱看起來沒用,注意高級紅包接口和商戶平臺現(xiàn)金紅包中的管理紅包和創(chuàng)建紅包無關(guān),這兩個地方是給手工發(fā)送紅包使用的。
7、可選的4個參數(shù),目前看來都沒用,不要傳。logo_imgurl, share_content, share_url, share_imgurl。
8、簽名注意,值為空的不要參與簽名。最后附加的key是微信支付的API密鑰,不是公眾平臺的密鑰,在商戶平臺->賬戶設置->安全設置->API安全右下角設置密鑰中設置,第一次使用微信支付需要設置。
9、中文不需要UrlEncode,Hash輸入是byte數(shù)組,用Encoding.UTF8.GetBytes來獲取。
10、證書強烈建議不采用微信官方Demo文件訪問形式證書,應該安裝在系統(tǒng)證書存儲容器中(在命令行輸入certmgr可以查看),并設置為私鑰不可以導出。
11、如果你采用10的方式,你很容易遇到無法找到證書的問題,要求運行程序windows賬號有訪問這個證書的權(quán)限。比如,如果雙擊運行的控制臺程序,證書安裝在當前用戶的個人類別中,那么程序就可以訪問證書。
如果是IIS賬戶,你可能需要指定應用程序池的執(zhí)行賬號為指定賬號,然后這個證書安裝在這個賬號下。
微信官方Demo采用文件的訪問形式,就不會有權(quán)限問題,但是要求你對證書文件保管好,以及證書密鑰保管好。
通過以上的簡略步驟相信功能以及實現(xiàn)的差不多了:
學習小程序做好的方式除了看文檔就是,模仿,給大家一個好鏈接,號稱目前為止最全的微信小程序項目實例
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
javascript獲取隱藏dom的寬高 具體實現(xiàn)
一個隱藏的DOM是獲取不到寬高的,如果想要獲取,采用下面的方法:2013-07-07js實現(xiàn)html table 行,列鎖定的簡單實例
下面小編就為大家?guī)硪黄猨s實現(xiàn)html table 行,列鎖定的簡單實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-10-10javascript中的event loop事件循環(huán)詳解
這篇文章主要給大家介紹了關(guān)于javascript中event loop事件循環(huán)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2018-12-12uniapp自定義頁面跳轉(zhuǎn)loading的實現(xiàn)代碼
有些頁面加載起來比較慢,為了加強用戶體驗效果,所以一般都會做一個頁面加載等待的提示,頁面加載完成后消失,下面這篇文章主要給大家介紹了關(guān)于uniapp自定義頁面跳轉(zhuǎn)loading的實現(xiàn)代碼,需要的朋友可以參考下2023-06-06JavaScript正則函數(shù)中test和match的區(qū)別解析
在javascript中,用于檢測一個字符串是否匹配某個模式用的比較多的就是test和match方法。,這篇文章主要介紹了js正則函數(shù)中test和match的區(qū)別,需要的朋友可以參考下2022-11-11