您好,登錄后才能下訂單哦!
這篇文章給大家介紹怎么在微信小程序中實現紅包功能,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
index.js
//搶紅包相關 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現金紅包', paymsg2: '恭喜您\n成功領取下單紅包獎勵' }) }else{ that.setData({ paymsg: '領取失敗\n'+response.data.msg, paymsg2: '非常抱歉\n如不不明,請聯系客服' }) } }, fail: function (res) { console.log(response); that.setData({ paymsg: '領取失敗' }) } }) }, 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">領紅包</button> <view class="draw-list {{showFlag == 1? 'active':''}}"> <image bindtap="openHb" class="{{_num==1?'active':''}}" src="https://cache.yisu.com/upload/information/20200622/114/40483.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代碼:
/* * 企業付款到零錢 **/ public function weixin_pay_person($re_openid) { $obj = new WxopenWechatService(); // 請求參數 $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'] = "恭喜你得到一個紅包";//企業付款描述信息 $data['spbill_create_ip'] = $obj->get_client_ip();//IP地址 $appsecret = WxopenWechatConfig::$compay_config['key']; $data['sign'] = $this->sign($data, $appsecret); //發紅包接口地址 $url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers"; //將請求數據由數組轉換成xml $xml = $this->arraytoxml($data); //進行請求操作 $res = $this->curl($xml, $url); //將請求結果由xml轉換成數組 $arr = $this->xmltoarray($res); if (is_array($arr)) { $arr['total_amount'] = $data['amount']; } //請請求信息和請求結果錄入到數據庫中 // 輸出請求結果數組 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); } /* * 將數組轉換成xml **/ private function arraytoxml( $arr ) { $xml = "<xml>"; foreach ($arr as $k => $v) { $xml .= "<" . $k . ">" . $v . "</" . $k . ">"; } $xml .= "</xml>"; return $xml; } /* * 將xml轉換成數組 **/ 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(); //抓取指定網頁 curl_setopt($ch, CURLOPT_URL, $postUrl); //設置header curl_setopt($ch, CURLOPT_HEADER, 0); //要求結果為字符串且輸出到屏幕上 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); //關閉curl curl_close($ch); return $data; } public function get_tradeno($str) { return $str . date("Ymd", time()) . date("His", time()) . rand(1111, 9999); }
別人總結的相當寶貴的踩坑經驗:
1、紅包是以分為單位,必須大于100分,小于20000分之間。
2、用戶無需關注你的公眾號(或服務號,下同),如果關注了你的公眾號,紅包會通過公眾號發送,如果沒有,通過服務通知發送。
3、接口中的訂單號由“微信支付商戶號+4位年+2為月份+2位日期+10位一天內不能重復的數字”,這個一天是自然日。
4、目前不支持發送隨機紅包,因此接口中提交的字段min_value、max_value、total_amount這3個值大小必須一樣,total_num值必須為1.
5、隨機紅包可以自己的程序實現,在100~20000隨機出一個數值,然后給上面3個值設定這個隨機結果。
6、活動名稱看起來沒用,注意高級紅包接口和商戶平臺現金紅包中的管理紅包和創建紅包無關,這兩個地方是給手工發送紅包使用的。
7、可選的4個參數,目前看來都沒用,不要傳。logo_imgurl, share_content, share_url, share_imgurl。
8、簽名注意,值為空的不要參與簽名。最后附加的key是微信支付的API密鑰,不是公眾平臺的密鑰,在商戶平臺->賬戶設置->安全設置->API安全右下角設置密鑰中設置,第一次使用微信支付需要設置。
9、中文不需要UrlEncode,Hash輸入是byte數組,用Encoding.UTF8.GetBytes來獲取。
10、證書強烈建議不采用微信官方Demo文件訪問形式證書,應該安裝在系統證書存儲容器中(在命令行輸入certmgr可以查看),并設置為私鑰不可以導出。
11、如果你采用10的方式,你很容易遇到無法找到證書的問題,要求運行程序windows賬號有訪問這個證書的權限。比如,如果雙擊運行的控制臺程序,證書安裝在當前用戶的個人類別中,那么程序就可以訪問證書。
如果是IIS賬戶,你可能需要指定應用程序池的執行賬號為指定賬號,然后這個證書安裝在這個賬號下。
微信官方Demo采用文件的訪問形式,就不會有權限問題,但是要求你對證書文件保管好,以及證書密鑰保管好。
關于怎么在微信小程序中實現紅包功能就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。