微信小程序?qū)崿F(xiàn)紅包功能(后端PHP實(shí)現(xiàn)邏輯)
本文為大家分享了微信小程序紅包功能的具體代碼,供大家參考,具體內(nèi)容如下
首先說明一點(diǎn):微信小程序紅包功能一定記得用企業(yè)付款到錢包功能,別用微信的現(xiàn)金紅包接口,否則你就有踩不完的坑。
直接上代碼了
微信小程序代碼:
index.js
//搶紅包相關(guān)
view_moneysure: function () {
var that = this;
wx.request({
url: app.globalData.baseurl +'api/wxopen/applet/grab',//這個(gè)鏈接是后端寫的
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)取下單紅包獎(jiǎng)勵(lì)'
})
}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();// 隨機(jī)字符串
//商戶訂單號,可以按要求自己組合28位的商戶訂單號
$data['partner_trade_no'] = $this->get_tradeno($data['mchid']);
$data['openid'] = $re_openid;//用戶openid
$data['check_name'] = 'NO_CHECK';//校驗(yàn)用戶姓名選項(xiàng)
$data['amount'] = '100';//金額,單位為分
$data['desc'] = "恭喜你得到一個(gè)紅包";//企業(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);
//進(jìn)行請求操作
$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位唯一隨機(jī)字符串
**/
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實(shí)體
libxml_disable_entity_loader(true);
$xmlstring = simplexml_load_string($xml, "SimpleXMLElement", LIBXML_NOCDATA);
$arr = json_decode(json_encode($xmlstring), true);
return $arr;
}
/*
* 進(jìn)行curl操作
**/
private
function curl(
$param = "", $url
) {
$postUrl = $url;
$curlPost = $param;
//初始化curl
$ch = curl_init();
//抓取指定網(wǎng)頁
curl_setopt($ch, CURLOPT_URL, $postUrl);
//設(shè)置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);
// 終止從服務(wù)端進(jìn)行驗(yàn)證
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
//這個(gè)是證書的位置
curl_setopt($ch, CURLOPT_SSLCERT, __DIR__ . '/cert/apiclient_cert.pem');
//這個(gè)也是證書的位置
curl_setopt($ch, CURLOPT_SSLKEY, __DIR__ . '/cert/apiclient_key.pem');
//運(yùn)行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é)的相當(dāng)寶貴的踩坑經(jīng)驗(yàn):
1、紅包是以分為單位,必須大于100分,小于20000分之間。
2、用戶無需關(guān)注你的公眾號(或服務(wù)號,下同),如果關(guān)注了你的公眾號,紅包會通過公眾號發(fā)送,如果沒有,通過服務(wù)通知發(fā)送。
3、接口中的訂單號由“微信支付商戶號+4位年+2為月份+2位日期+10位一天內(nèi)不能重復(fù)的數(shù)字”,這個(gè)一天是自然日。
4、目前不支持發(fā)送隨機(jī)紅包,因此接口中提交的字段min_value、max_value、total_amount這3個(gè)值大小必須一樣,total_num值必須為1.
5、隨機(jī)紅包可以自己的程序?qū)崿F(xiàn),在100~20000隨機(jī)出一個(gè)數(shù)值,然后給上面3個(gè)值設(shè)定這個(gè)隨機(jī)結(jié)果。
6、活動名稱看起來沒用,注意高級紅包接口和商戶平臺現(xiàn)金紅包中的管理紅包和創(chuàng)建紅包無關(guān),這兩個(gè)地方是給手工發(fā)送紅包使用的。
7、可選的4個(gè)參數(shù),目前看來都沒用,不要傳。logo_imgurl, share_content, share_url, share_imgurl。
8、簽名注意,值為空的不要參與簽名。最后附加的key是微信支付的API密鑰,不是公眾平臺的密鑰,在商戶平臺->賬戶設(shè)置->安全設(shè)置->API安全右下角設(shè)置密鑰中設(shè)置,第一次使用微信支付需要設(shè)置。
9、中文不需要UrlEncode,Hash輸入是byte數(shù)組,用Encoding.UTF8.GetBytes來獲取。
10、證書強(qiáng)烈建議不采用微信官方Demo文件訪問形式證書,應(yīng)該安裝在系統(tǒng)證書存儲容器中(在命令行輸入certmgr可以查看),并設(shè)置為私鑰不可以導(dǎo)出。
11、如果你采用10的方式,你很容易遇到無法找到證書的問題,要求運(yùn)行程序windows賬號有訪問這個(gè)證書的權(quán)限。比如,如果雙擊運(yùn)行的控制臺程序,證書安裝在當(dāng)前用戶的個(gè)人類別中,那么程序就可以訪問證書。
如果是IIS賬戶,你可能需要指定應(yīng)用程序池的執(zhí)行賬號為指定賬號,然后這個(gè)證書安裝在這個(gè)賬號下。
微信官方Demo采用文件的訪問形式,就不會有權(quán)限問題,但是要求你對證書文件保管好,以及證書密鑰保管好。
通過以上的簡略步驟相信功能以及實(shí)現(xiàn)的差不多了:
學(xué)習(xí)小程序做好的方式除了看文檔就是,模仿,給大家一個(gè)好鏈接,號稱目前為止最全的微信小程序項(xiàng)目實(shí)例
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
javascript獲取隱藏dom的寬高 具體實(shí)現(xiàn)
一個(gè)隱藏的DOM是獲取不到寬高的,如果想要獲取,采用下面的方法:2013-07-07
JavaScript實(shí)現(xiàn)密碼框輸入驗(yàn)證
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)密碼框輸入驗(yàn)證,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
js實(shí)現(xiàn)html table 行,列鎖定的簡單實(shí)例
下面小編就為大家?guī)硪黄猨s實(shí)現(xiàn)html table 行,列鎖定的簡單實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-10-10
javascript中的event loop事件循環(huán)詳解
這篇文章主要給大家介紹了關(guān)于javascript中event loop事件循環(huán)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12
javascript簡單鏈?zhǔn)秸{(diào)用案例分析
這篇文章主要介紹了javascript簡單鏈?zhǔn)秸{(diào)用,結(jié)合具體實(shí)例形式模擬jQuery分析了鏈?zhǔn)秸{(diào)用的原理與具體實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-05-05
uniapp自定義頁面跳轉(zhuǎn)loading的實(shí)現(xiàn)代碼
有些頁面加載起來比較慢,為了加強(qiáng)用戶體驗(yàn)效果,所以一般都會做一個(gè)頁面加載等待的提示,頁面加載完成后消失,下面這篇文章主要給大家介紹了關(guān)于uniapp自定義頁面跳轉(zhuǎn)loading的實(shí)現(xiàn)代碼,需要的朋友可以參考下2023-06-06
JavaScript正則函數(shù)中test和match的區(qū)別解析
在javascript中,用于檢測一個(gè)字符串是否匹配某個(gè)模式用的比較多的就是test和match方法。,這篇文章主要介紹了js正則函數(shù)中test和match的區(qū)別,需要的朋友可以參考下2022-11-11

