微信小程序实现红包功能(后端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 相关文章推荐
基于jquery的表格排序
Sep 11 Javascript
jQuery取得select选择的文本与值的示例
Dec 09 Javascript
JS之Date对象和获取系统当前时间详解
Jan 13 Javascript
深入理解JavaScript系列(22):S.O.L.I.D五大原则之依赖倒置原则DIP详解
Mar 05 Javascript
node-webkit打包成exe文件被360误报木马的解决方法
Mar 11 Javascript
jQuery使用empty()方法删除元素及其所有子元素的方法
Mar 26 Javascript
浅谈Javascript数组的使用
Jul 29 Javascript
jQuery实现用户输入自动完成功能
Feb 13 Javascript
分析javascript中9 个常见错误阻碍你进步
Sep 18 Javascript
JS正则表达式完美实现身份证校验功能
Oct 18 Javascript
浅谈vue加载优化策略
Mar 19 Javascript
vue给对象动态添加属性和值的实例
Sep 09 Javascript
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
一个多文件上传的例子(原创)
2006/10/09 PHP
Yii redis集合的基本使用教程
2020/06/14 PHP
基于jquery的页面划词搜索JS
2010/09/14 Javascript
Highcharts 非常实用的Javascript统计图demo示例
2013/07/03 Javascript
jquery实现图片渐变切换兼容ie6/Chrome/Firefox
2013/08/02 Javascript
js onload事件不起作用示例分析
2013/10/09 Javascript
jsonp原理及使用
2013/10/28 Javascript
bootstrap响应式表格实例详解
2017/05/15 Javascript
浅谈vue的踩坑路
2017/08/31 Javascript
Vue CLI 2.x搭建vue(目录最全分析)
2019/02/27 Javascript
解决vue单页面修改样式无法覆盖问题
2019/08/05 Javascript
vue学习笔记之slot插槽基本用法实例分析
2020/02/01 Javascript
理解Proxy及使用Proxy实现vue数据双向绑定操作
2020/07/18 Javascript
python使用in操作符时元组和数组的区别分析
2015/05/19 Python
将字典转换为DataFrame并进行频次统计的方法
2018/04/08 Python
详解python异步编程之asyncio(百万并发)
2018/07/07 Python
Python求两个圆的交点坐标或三个圆的交点坐标方法
2018/11/07 Python
使用python判断jpeg图片的完整性实例
2019/06/10 Python
python 实现12bit灰度图像映射到8bit显示的方法
2019/07/08 Python
对Python函数设计规范详解
2019/07/19 Python
django认证系统实现自定义权限管理的方法
2019/08/28 Python
Python单元测试工具doctest和unittest使用解析
2019/09/02 Python
python对 MySQL 数据库进行增删改查的脚本
2020/10/22 Python
html5 自定义播放器核心代码
2013/12/20 HTML / CSS
HTML5新增加标签和功能概述
2016/09/05 HTML / CSS
德国购买踏板车网站:Microscooter
2019/10/14 全球购物
台湾专柜女包:KINAZ
2019/12/26 全球购物
Conforama瑞士:家具、厨房、电器、装饰
2020/09/06 全球购物
英文留学推荐信范文
2014/01/25 职场文书
军训教官感言
2014/03/02 职场文书
小学评语大全
2014/04/22 职场文书
毕业酒会致辞
2015/07/29 职场文书
新年寄语2016
2015/08/17 职场文书
MySQL中的隐藏列的具体查看
2021/09/04 MySQL
html5调用摄像头截图功能
2022/01/18 Javascript
Python OpenCV超详细讲解基本功能
2022/04/02 Python