评论

小程序营销利器,wx.sendBizRedPacket小程序红包完整详细开发代码,小程序中直接领取微信红包,无需任何资质

小程序红包完整详细开发代码,小程序中直接领取微信红包,无需任何资质

 今天给大家详细的讲讲微信的功能,小程序红包,直接在小程序里领取红包,无需额外代码,红包是调取微信原生的红包流程,红包金额直接进用户微信零钱里

   效果如下图

   

   

 

   

   **步骤1: 开通小程序红包权限**

   

   开通条件

1、即时入账且结算周期为T+1的商户,需满足1)入驻满90天,2)连续正常交易30天,3)保持正常健康交易。


2、其他结算周期的商户,暂无90/30天开通限制,但需保持正常健康交易。


3、商户选择开通权限的小程序未开通社交红包类目。


4、小程序主体不存在限制该功能使用的违规情况,包括但不限于:涉嫌欺诈,涉嫌违反相关法律法规等。


这个90/30天不清楚  ,反正我的是没程序开发差不多了就点击开通 直接可以开通,好像没到30天就行了.


在微信商户号->产品中心找到小程序红包,点击开通

开通后需要到产品设置里,按APPID开通商户号绑定的小程序的权限,这步很重要

  **步骤2:编写代码 **

  

  先讲一下程序逻辑

 

 1.像商户号里充值金额,有金额才能发红包

 2.以用户OPENID为基础生成一个红包,这个可以让客户在前端调取后台接口生成,然后在前端直接领取,如果提前有了用户OPENID也可以后台直接预先生成红包,用户在进入前端指定页面领取.   所以  这个有俩个流程   一个是生成红包,一个是领取红包   要调用俩次业务逻辑



废话不多说 下面附上代码  ,我这里是直接让客户在前端生成并直接领取红包


首先在想让客户领取红包的指定前端JS界面编写代码生成红包


onLoad: function (options) {

 if (!!options.scene) {

id = decodeURIComponent(options.scene)

 } else {

id = options.id

 }

 var that = this

  util.getauth().then(function (res) { 在自己写在Uitl里的方法,主要是获取用户openid

    if(res){

      var data = wx.getLaunchOptionsSync()//获取场景代码

      if (data.scene == 1047 || data.scene == 1011 || data.scene == 1025 || data.scene == 1124){

        that.getredpacket()

      }

    }

 })

},



//领取红包方法

getredpacket: function () {

var that = this

wx.showLoading({

title: '加载中~',

mask: true

})

wx.request({

url: getApp().globalData.url + 'detail/createredpacket',

method: 'POST',

header: {// 设置请求的 header  

'content-type': 'application/x-www-form-urlencoded'

},

data: {

orderid: id,

openid: getApp().globalData.openid

},

success: function (res) {


//这里是向服务器判断该页面是否有红包 ,如果有的话像服务器传用户OPENID,生成一个红包,这里可以先不用看下面代码,直接看服务器端代码 然后再回来看后面的代码

console.log(res.data)

wx.hideLoading()

if(res.data==2){

return

}

if (res.data.code == 1) {

console.log(res.data)

wx.sendBizRedPacket({

timeStamp: res.data.timeStamp, // 支付签名时间戳,

nonceStr: res.data.nonceStr, // 支付签名随机串,不长于 32 位

package: res.data.package, //扩展字段,由商户传入

signType: res.data.signType, // 签名方式,

paySign: res.data.paySign, // 支付签名

success: function (res) {

console.log(res)

},

fail: function (res) {

console.log(res)

},

complete: function (res) {

console.log(res)

}

})

} else {

//生成红包失败,提示错误码

wx.showToast({

title: res.data.msg,

icon: 'none'

})

}

},

fail: function (res) {

wx.showToast({

title: '请求失败',

})

},

})

},



服务器端代码  这里用的是PHP

//生成小程序红包方法

public function createredpacket(){ 

    $post = input('post.');

    if(db('order')->where('id',$post['orderid'])->value('isredpacket')==0){

        echo 2;

        die;

    }//这里是我自己程序的逻辑  判断这个订单是否开启红包,没有的话直接退出




    $setting =db('setting')->field('miniappid,appsecret,mch_id')->find();

    $url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/sendminiprogramhb';//请求生成红包的网址

    $parameters = array(

        'nonce_str' => createNoncestr(), //随机字符串,不长于32位 这个方法就是随机获得32位随机字符

        'mch_billno' => '13513841535135153', //商户订单号

        'mch_id' => $setting['mch_id'], //随机字符串

        'wxappid' => $setting['miniappid'],//小程序appid,这里不用文档的公众号APPID,直接填你的小程序APPID就行

        'send_name' => '我是土豪',//红包发送者名称

        're_openid'=>$post['openid'],//用户OpenId

        'total_amount'=>1000,//付款金额,单位分

        'total_num'=>1,//红包发放总人数

        'wishing' => '祝您万事大吉',//红包祝福语String(128)

        'act_name' => '测试活动',//活动名称String(32)

        'remark'=>'恭喜你',//备注String(256)

        'notify_way' => 'MINI_PROGRAM_JSAPI',//通过JSAPI方式领取红包,小程序红包固定传MINI_PROGRAM_JSAPI

        'scene_id'=>'PRODUCT_1',

    );

    //统一下单签名

    $parameters['sign'] = getSign($parameters);

    $xmlData = arrayToXml($parameters);

    $return = xmlToArray(postXmlSSLCurl($xmlData,$url));

    if($return['return_code']=='FAIL'){

        $res['code']=0;

        $res['msg']=$return['return_msg'];

        echo json_encode($res);

        die;

    }

    if($return['result_code']=='FAIL'){

        $res['code']=0;

        $res['msg']=$return['return_msg'];

        echo json_encode($res);

        die;

    }

    if($return['return_code']=='SUCCESS'&&$return['result_code']=='SUCCESS'){

        $res = array(

            'appId'=>$setting['miniappid'],//应用ID

            'timeStamp' => time()."", //时间戳,必须为字符串,增加.""转为字符串,

            'nonceStr' => createNoncestr(), //随机字符串

            'package' => urlencode($return['package']), //红包详情的扩展

        );

        $res['paySign'] = $this->getSign($res);

        $res['signType'] ='MD5';

        $res['code'] = 1;

        echo json_encode($res);

    }else{

        $res['code']=0;

        $res['msg']='生成红包错误,请重试';

        echo json_encode($res);

    }

}



步骤3:开发时遇到的天坑,注意注意,重点重点:!!!!!!!

1.createNoncestr(),getSign,arrayToXml,xmlToArray,postXmlSSLCurl这几个方式是我集成的方法,开发微信支付的时候都会用的 感觉没必要写出来,不会的可以搜一搜微信支付的教程里面都有    这里的请求时需要商户号证书的哦

2.每个号测试的时候一天一个openID只能生成10个红包,怕测试失败  就把生成红包接口返回的$return['package']保存起来   生成红包全靠他了

3.timeStamp' => time()."",  这个timeStamp必须是字符串,如果直接time(),用数字的话前端会报错请求不成功,而且wx.sendBizRedPacket()小程序的这个接口小程序开发文档里没有该接口文档,测试了下 FAIL回调方法里   不管什么错误   只会给你返回一个请求不成功,我就是没细心看文档被这个数字的时间戳搞死了  最后才发现是传的数字....

4.urlencode($return['package'])  这个是生成签名的时候就urlencode 

5.签名的时候看好参数,和其他的接口不一样不要按老经验来,这里是用appId,timeStamp,nonceStr,package这4个参数生成签名,没有signType 这个参数,返回前端您的时候确实不需要APPID,需要SIGNTYPE.

6.这里返回前端领取红包的签名最后不要转为大写哦,之前写错了   现在更正一下

7.wx.getLaunchOptionsSync()//获取场景代码   必须要用这个判断一下页面场景值,就是你通过什么方式进入的小程序,每个进入方法都有一个值,叫场景值.如果没有判断,那就是所有场景都生成红包,,哈哈这下你会发现 红包是生成了 可是领不了.除非你把每个package都保存起来,或者不是和我一样直接生成待领取..要不你冲的那点钱根本不够用...好像没有撤回红包方法,乖乖等24小时后退回把

8.这个是最坑的一点,为什么写到最后,因为我也想让您们体验一下我的绝望.........这个红包只在1011,1025,1047,1124这四个场景值中触发,不用查资料弄这4个场景值是啥意思了    现在我就可以负责人的告诉你,   只能手机用摄像头扫   不要和我一样妄想着把图片放朋友圈  别人长按识别就能领取了.........你想到的方法我都试过了  一维码   二维码    小程序码   甚至一物一码   都只支持用摄像头扫,    长按和微信扫一扫在相册里扫都不行 都不触发.....


结束语:第一眼看这个是营销炸弹般牛的功能,结果这个场景值砍了百分之90的营销力度..............官方一句话其他场景暂不支持......期待把



第二次给前端使用的签名和第一次的不太一样,不需要转化大写  在这里补上



/作用:生成签名 

 function getSign($Obj) { 

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

   $Parameters[$k] = $v; 

  } 

  //签名步骤一:按字典序排序参数 

  ksort($Parameters); 

  $String = $this->formatBizQueryParaMap($Parameters, false); 

  $mchkey = db('setting')->value('mch_key'); 

  //签名步骤二:在string后加入KEY 

  $String = $String . "&key=".$mchkey; 

  //签名步骤三:MD5加密 

  $String = md5($String); 

  return $String; 

 }

  

///作用:格式化参数,签名过程需要使用 

function formatBizQueryParaMap($paraMap, $urlencode) { 

 $buff = ""; 

 ksort($paraMap); 

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

  if ($urlencode) { 

   $v = urlencode($v); 

  } 

  $buff .= $k . "=" . $v . "&"; 

 } 

 $reqPar; 

 if (strlen($buff) > 0) { 

  $reqPar = substr($buff, 0, strlen($buff) - 1); 

 } 

 return $reqPar; 

}


最后一次编辑于  2021-04-15  
点赞 7
收藏
评论

31 个评论

  • 。
    2020-01-03

    有没有现成的源码

    2020-01-03
    赞同
    回复 3
    • 纸玫瑰
      纸玫瑰
      2020-01-04
      有PHP的
      2020-01-04
      回复
    • 。
      2020-01-06回复纸玫瑰
      方便给个下载地址吗
      2020-01-06
      回复
    • 纸玫瑰
      纸玫瑰
      2020-01-06
      文章不是写了么......
      2020-01-06
      1
      回复
  • 习惯
    习惯
    2019-12-20

    大佬麻烦帮我看看我这哪里有问题啊

    2019-12-20
    赞同
    回复 6
    • 纸玫瑰
      纸玫瑰
      2019-12-20
      先说说你是卡到哪步了?
      2019-12-20
      回复
    • 习惯
      习惯
      2019-12-20回复纸玫瑰
      领取不到,发送成功了
      貌似再说没有权限
      请问这个跟场景值有关系么
      2019-12-20
      回复
    • 纸玫瑰
      纸玫瑰
      2019-12-20
      有提示错误么?      是和场景值有关,如果场景值不对  是弹不出来东西的,  连报错都不会
      2019-12-20
      1
      回复
    • 习惯
      习惯
      2019-12-20回复纸玫瑰
      sendBizRedPacket:fail jsapi has no permission, event=sendBizRedPacket, runningState=foreground
      2019-12-20
      回复
    • 纸玫瑰
      纸玫瑰
      2019-12-20
      说这个接口未被统一,查查商户号授权了么?
      2019-12-20
      回复
    查看更多(1)
  • 🌈
    🌈
    2019-12-19

    这个是用公众号的OpenID发红包还是小程序的OpenID发红包???

    2019-12-19
    赞同
    回复 1
    • 纸玫瑰
      纸玫瑰
      2019-12-19
      小程序的哦
      2019-12-19
      回复
  • 。
    2019-12-12

    这个红包的单位是可以自己定的吗?

    2019-12-12
    赞同
    回复 10
    • 纸玫瑰
      纸玫瑰
      2019-12-13
      单位是分,数额可以改,默认最低1元,可以申请至最低0.3元
      2019-12-13
      回复
    • 莫忘灬
      莫忘灬
      2019-12-19
      楼主您好,我不知道我这个签名对不对,我的理解是对所有必填项 , 进行签名, 然后在把签名作为参数 传入接口
      2019-12-19
      回复
    • 莫忘灬
      莫忘灬
      2019-12-19
      2019-12-19
      回复
    • 莫忘灬
      莫忘灬
      2019-12-19回复纸玫瑰
      楼主看一下 思路 对吗?
      2019-12-19
      回复
    • 纸玫瑰
      纸玫瑰
      2019-12-19
      额...可能说错了刚才  这个发红包总共要签名2次,第一次生成红包和微信支付的一样,   第二次传给前端的时候签名和微信支付的不一样,具体的你仔细看下文档吧,...
      2019-12-19
      1
      回复
    查看更多(5)
  • 阿达
    阿达
    2019-12-11

    https://developers.weixin.qq.com/community/pay/doc/00060872b74630576c99d5fd558400?fromCreate=1  能帮我看下不?

    2019-12-11
    赞同
    回复 9
    • 纸玫瑰
      纸玫瑰
      2019-12-11
      我们要的是package,返回来是spid也算 是成功了,用这个红包领不行么?
      2019-12-11
      回复
    • 纸玫瑰
      纸玫瑰
      2019-12-11
      if($return['return_code']=='SUCCESS'&&$return['result_code']=='SUCCESS'){
              $res = array(
                  'appId'=>$setting['miniappid'],//应用ID
                  'timeStamp' => time()."", //时间戳,必须为字符串,增加.""转为字符串,
                  'nonceStr' => createNoncestr(), //随机字符串
                  'package' => urlencode($return['package']), //红包详情的扩展
              );
              $res['paySign'] = $this->getSign($res);
              $res['signType'] ='MD5';
              $res['code'] = 1;
              echo json_encode($res);
          }else{
              $res['code']=0;
              $res['msg']='生成红包错误,请重试';
              echo json_encode($res);
          }

      猜想服务端这里第二次给前端生成签名的时候,这里APPID,就是回复代码加粗的那个,填你的APPID 不行久填你的SPID试试
      2019-12-11
      回复
    • 纸玫瑰
      纸玫瑰
      2019-12-11
      文档上特约商户没有做特殊说明,按他的格式来,只要package里的APPID或spid和商户号对应,应该是可以的  ,我这里没条件测试特约商户的.....只能猜一猜了
      2019-12-11
      回复
    • 阿达
      阿达
      2019-12-11回复纸玫瑰
      不行呢  能试的都试了  一直请求不成功 场景是1011 签名是用这个package urlurlencode之后和appId timeStamp nonceStr 拼接key一起MD5的
      2019-12-11
      回复
    • 纸玫瑰
      纸玫瑰
      2019-12-11回复阿达
      我把第二次签名的方法补加到文章里了,你看看签名方法对么,主要是转为格式化 再加key  直接转MD5  这里不转大写    不行的话就只能咨询官方了  我这边没有条件测试特约商户的
      2019-12-11
      1
      回复
    查看更多(4)
  • 君莫笑
    君莫笑
    2019-12-10

    我现在遇到的问题是  我商户平台开通小程序红包功能  产品设置里 授权小程序APPID也显示为开通  但是请求微信接口时 返回 该商户号未开通该现金红包功能(加入了小程序表示 MINI_PROGRAM_JSAPI),但是微信公众号就可以(取掉MINI_PROGRAM_JSAPI

    2019-12-10
    赞同
    回复 4
  • 君莫笑
    君莫笑
    2019-12-10

    开通小程序红包 需要更换证书吗?

    2019-12-10
    赞同
    回复
  • 莫忘灬
    莫忘灬
    2019-12-03

    这个教程是:用户在小程序领取红包, 那么请问用户在小程序内发红包 现在支持吗?

    2019-12-03
    赞同
    回复 4
    • 纸玫瑰
      纸玫瑰
      2019-12-03
      可以啊  可以让用户付款   然后写代码在你的商户余额里扣除对应的钱生成红包  这样的话.....不知道审核能不能过就是      这个是本程序的商家给用户发   别人借助平台发按理说要红包类目资质
      2019-12-03
      回复
    • 莫忘灬
      莫忘灬
      2019-12-03回复纸玫瑰
      谢谢
      2019-12-03
      回复
    • 纸玫瑰
      纸玫瑰
      2019-12-03回复莫忘灬
      哈哈 客气
      2019-12-03
      回复
    • 莫忘灬
      莫忘灬
      2019-12-06回复纸玫瑰
      有没有java 例子
      2019-12-06
      回复
  • 遂便
    遂便
    2019-11-28

    这两次用到的appid都是小程序的appid吗  看文档上写的要用公众号的appid呀

    2019-11-28
    赞同
    回复 4
    • 纸玫瑰
      纸玫瑰
      2019-11-28
      对的  都是小程序得   不用公众号得
      2019-11-28
      回复
    • 遂便
      遂便
      2019-11-28回复纸玫瑰
      老哥  如果我们公司内部给客户发红包的话是不是就不用设置createredpacket这个方法了?只需要在小程序上调用wx.sendBizRedPacket就可以领红包?
      2019-11-28
      回复
    • 纸玫瑰
      纸玫瑰
      2019-11-28
      需要哦     这个微信发红包的流程是一样的   先选择发送的人 然后生成一个红包   有了这个红包客户才能领
      2019-11-28
      回复
    • 莫忘灬
      莫忘灬
      2019-12-05
      有没有java 例子
      2019-12-05
      回复
  • ken
    ken
    2019-11-27

    请问 wx.sendBizRedPacket 调用这个接口的时候 需要引用微信的sdk吗?


    2019-11-27
    赞同
    回复 9
    • 纸玫瑰
      纸玫瑰
      2019-11-27
      不需要得 这个是小程序内置的接口   开发者工具上直接用 只是这个接口再小程序接口文档中没写而已
      2019-11-27
      回复
    • ken
      ken
      2019-11-28回复纸玫瑰
      签名都对了以后,为什么显示的请求不成功呢?
      2019-11-28
      回复
    • ken
      ken
      2019-11-28回复纸玫瑰
      我的时间戳也是字符串只不过是秒的 没有精确到毫秒
      2019-11-28
      回复
    • 纸玫瑰
      纸玫瑰
      2019-11-28回复ken
      时间戳10位就行,这个接口无论什么错误都是返回请求不成功,签名错误也不会返回签名错误得
      2019-11-28
      回复
    • 纸玫瑰
      纸玫瑰
      2019-11-28
      你看下我下面得那个回复郁帝得回复.我哪里又把第二次不用转大写得签名方法写出来了
      2019-11-28
      回复
    查看更多(4)

正在加载...

登录 后发表内容