微信小程序实现红包功能(后端PHP实现逻辑)


Posted in Javascript onJuly 11, 2018

本文为大家分享了微信小程序红包功能的具体代码,供大家参考,具体内容如下

首先说明一点:微信小程序红包功能一定记得用企业付款到钱包功能,别用微信的现金红包接口,否则你就有踩不完的坑。

直接上代码了

微信小程序代码:

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="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代码:

/*
 * 企业付款到零钱
 **/
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采用文件的访问形式,就不会有权限问题,但是要求你对证书文件保管好,以及证书密钥保管好。

通过以上的简略步骤相信功能以及实现的差不多了:

学习小程序做好的方式除了看文档就是,模仿,给大家一个好链接,号称目前为止最全的微信小程序项目实例

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js计算页面刷新的次数
Jul 20 Javascript
javascript中的toFixed固定小数位数 简单实例分享
Jul 12 Javascript
jQuery实现向下滑出的二级菜单效果实例
Aug 22 Javascript
jQuery实现商品活动倒计时
Oct 16 Javascript
详解JavaScript中|单竖杠运算符的使用方法
May 23 Javascript
JavaScript必知必会(六) delete in instanceof
Jun 08 Javascript
浅析从vue源码看观察者模式
Jan 29 Javascript
使用vuex解决刷新页面state数据消失的问题记录
May 08 Javascript
node基于async/await对mysql进行封装
Jun 20 Javascript
使用Angular material主题定义自己的组件库的配色体系
Sep 04 Javascript
让mocha支持ES6模块的方法实现
Jan 14 Javascript
vue如何在data中引入图片的正确路径
Jun 05 Vue.js
Vue如何实现响应式系统
Jul 11 #Javascript
vue.js内置组件之keep-alive组件使用
Jul 10 #Javascript
小程序图片剪裁加旋转的示例代码
Jul 10 #Javascript
vue使用中的内存泄漏【推荐】
Jul 10 #Javascript
Vue脚手架的简单使用实例
Jul 10 #Javascript
vue自定义移动端touch事件之点击、滑动、长按事件
Jul 10 #Javascript
微信小程序中换行空格(多个空格)写法详解
Jul 10 #Javascript
You might like
[FAQ]PHP中的一些常识:类篇
2006/10/09 PHP
PHP 在5.1.* 和5.2.*之间 PDO数据库操作中的不同之处小结
2012/03/07 PHP
PHP结合Mysql数据库实现留言板功能
2016/03/04 PHP
JS原型对象通俗&quot;唱法&quot;
2012/12/27 Javascript
浅谈Javascript 执行顺序
2013/12/18 Javascript
javascript文件中引用依赖的js文件的方法
2014/03/17 Javascript
js调用百度地图及调用百度地图的搜索功能
2015/09/07 Javascript
Jquery操作Ajax方法小结
2015/11/29 Javascript
angularjs表格分页功能详解
2016/01/21 Javascript
jQuery设计思想
2017/03/07 Javascript
原生js实现吸顶效果
2017/03/13 Javascript
javascript实现滑动解锁功能
2017/03/22 Javascript
VUE2 前端实现 静态二级省市联动选择select的示例
2018/02/09 Javascript
解决淘宝cnpm 安装后cnpm不是内部或外部命令的问题
2018/05/17 Javascript
记一次vue去除#问题处理经过小结
2019/01/24 Javascript
微信小程序常用简易小函数总结
2019/02/01 Javascript
解决vue组件没显示,没起作用,没报错,但该显示的组件没显示问题
2020/09/02 Javascript
Python的IDEL增加清屏功能实例
2017/06/19 Python
Python实现PS滤镜的万花筒效果示例
2018/01/23 Python
python修改list中所有元素类型的三种方法
2018/04/09 Python
Python理解递归的方法总结
2019/01/28 Python
Keras 利用sklearn的ROC-AUC建立评价函数详解
2020/06/15 Python
Python使用paramiko连接远程服务器执行Shell命令的实现
2021/03/04 Python
Spanx塑身衣官网:美国知名内衣品牌
2017/01/11 全球购物
Myprotein西班牙官网:欧洲第一大运动营养品牌
2020/02/24 全球购物
芭比波朗加拿大官方网站:Bobbi Brown Cosmetics CA
2020/11/05 全球购物
函授自我鉴定
2013/11/06 职场文书
会计电算化专业毕业生推荐信
2013/12/24 职场文书
中学教师请假制度
2014/02/03 职场文书
关于奉献的演讲稿
2014/05/21 职场文书
党校学习个人总结
2015/02/15 职场文书
酒店员工管理制度
2015/08/05 职场文书
2019年工作总结范文
2019/05/21 职场文书
导游词之上海杜莎夫人蜡像馆
2019/11/22 职场文书
话题作文之诚信
2019/11/28 职场文书
导游词之南昌滕王阁
2019/11/29 职场文书