實現小程直播帶貨app原始碼的紅包傳送功能

雲豹科技曉彤發表於2021-08-05

本文為大家分享了直播帶貨app原始碼紅包功能的具體程式碼,主要是實現小程式端的功能,供大家參考,具體內容如下

首先說明一點:直播帶貨app原始碼的紅包功能一定記得用企業付款到錢包功能,別用微信的現金紅包介面,否則你就有踩不完的坑。

直接上程式碼了

微信小程式程式碼:

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程式碼:

領紅包

{{paymsg}}

{{paymsg2}}

確定

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 = "";

foreach ($arr as $k => $v) {

$xml .= "" . $v . "" . $k . ">";

}

$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、使用者無需關注直播帶貨app原始碼的公眾號(或服務號,下同),如果關注了你的公眾號,紅包會透過公眾號傳送,如果沒有,透過服務通知傳送。

3、介面中的訂單號由“微信支付商戶號+4位年+2為月份+2位日期+10位一天內不能重複的數字”,這個一天是自然日。

4、直播帶貨app原始碼的小程式目前不支援傳送隨機紅包,因此介面中提交的欄位min_value、max_value、total_amount這3個值大小必須一樣,total_num值必須為1.

5、直播帶貨app原始碼的隨機紅包可以自己的程式實現,在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採用檔案的訪問形式,直播帶貨app原始碼就不會有許可權問題,但是要求你對證照檔案保管好,以及證照金鑰保管好。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70002045/viewspace-2785501/,如需轉載,請註明出處,否則將追究法律責任。

相關文章