微信小程序实现红包功能(后端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 相关文章推荐
javascript下4个跨浏览器必备的函数
Mar 07 Javascript
用apply让javascript函数仅执行一次的代码
Jun 27 Javascript
用javascript为页面添加天气显示实现思路及代码
Dec 02 Javascript
浅析jquery某一元素重复绑定的问题
Jan 03 Javascript
js中将String转换为number以便比较
Jul 08 Javascript
原生js轮播特效
May 18 Javascript
vue获取DOM元素并设置属性的两种实现方法
Sep 30 Javascript
JS+HTML+CSS实现轮播效果
Nov 28 Javascript
cropper js基于vue的图片裁剪上传功能的实现代码
Mar 01 Javascript
JavaScript数组特性与实践应用深入详解
Dec 30 Javascript
JQuery+Bootstrap 自定义全屏Loading插件的示例demo
Jul 03 jQuery
Antd下拉选择,自动匹配功能的实现
Oct 24 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
在Windows XP下安装Apache+MySQL+PHP环境
2015/02/22 PHP
thinkphp实现分页显示功能
2016/12/03 PHP
解决表单中第一个非隐藏的元素获得焦点的一个方案
2009/10/26 Javascript
理解Javascript_14_函数形式参数与arguments
2010/10/20 Javascript
jQuery输入城市查看地图使用介绍
2013/05/08 Javascript
以JSON形式将JS中Array对象数组传至后台的方法
2014/01/06 Javascript
深入解读JavaScript中的Iterator和for-of循环
2015/07/28 Javascript
浅析javascript中的事件代理
2015/11/06 Javascript
微信小程序 教程之列表渲染
2016/10/18 Javascript
Javascript中从学习bind到实现bind的过程
2018/01/05 Javascript
layui监听单元格编辑前后交互的例子
2019/09/16 Javascript
vue点击当前路由高亮小案例
2019/09/26 Javascript
Vue+Node实现商品列表的分页、排序、筛选,添加购物车功能详解
2019/12/07 Javascript
Python实现HTTP协议下的文件下载方法总结
2016/04/20 Python
Python实现识别手写数字 Python图片读入与处理
2020/03/23 Python
python批量查询、汉字去重处理CSV文件
2018/05/31 Python
Python使用grequests(gevent+requests)并发发送请求过程解析
2019/09/25 Python
如何理解Python中的变量
2020/06/01 Python
将tf.batch_matmul替换成tf.matmul的实现
2020/06/18 Python
浅谈html5 响应式布局
2014/12/24 HTML / CSS
Canvas 帧动画吃苹果小游戏
2020/08/05 HTML / CSS
澳大利亚最受欢迎的美发和美容在线商店:Catwalk
2018/12/12 全球购物
中国领先的汽车保养服务平台:途虎养车
2019/10/18 全球购物
美国知名眼镜网站:Target Optical
2020/04/04 全球购物
北京银河万佳Java面试题
2012/03/21 面试题
解释下面关于J2EE的名词
2013/11/15 面试题
秋季运动会表扬稿
2014/01/16 职场文书
幼儿园教师教学反思
2014/02/06 职场文书
户外活动总结范文
2014/04/30 职场文书
法制宣传口号
2014/06/16 职场文书
购房协议书范本
2014/10/02 职场文书
在职证明书模板
2015/06/15 职场文书
2019公司借款合同范本2篇!
2019/07/24 职场文书
python 实现mysql自动增删分区的方法
2021/04/01 Python
详解运行Python的神器Jupyter Notebook
2021/06/03 Python
浅析Django接口版本控制
2021/06/26 Python