精华内容
下载资源
问答
  • 微信公众号发红包

    2019-05-14 14:50:53
    踩过很多坑,希望这篇文可以为大家开发公众号领取红包,做个引导。更重要的是,我发现我有点忘了,所以为了下次再用到这方面的功能,特此,来做个记录 PS:可以多看看api文档,吐槽一下,微信开发api文档很坑,相比...

    踩过很多坑,希望这篇文可以为大家开发公众号领取红包,做个引导。更重要的是,我发现我有点忘了,所以为了下次再用到这方面的功能,特此,来做个记录

    PS:可以多看看api文档,吐槽一下,微信开发api文档很坑,相比之下,支付宝api看着就舒服多了。

    前期准备,公众号+有红包功能的商户号

    因为没有可用的域名,所有我用了菜单点击事件

    简单直接上代码,可以自己下载一个官方提供的源码对比着看。

       @RequestMapping(method = RequestMethod.POST)
        @ResponseBody
        public void weChatConnect(HttpServletRequest req, HttpServletResponse resp, HttpSession session) throws IOException{

            req.getInputStream();
            req.setCharacterEncoding("UTF-8");
            resp.setContentType("text/html;charset=utf-8");

            PrintWriter out=resp.getWriter();

            Map<String ,String> map= MessageUtil.xmlToMap(req);
            String fromUserName = map.get("FromUserName");
            String toUserName = map.get("ToUserName");
            String msgType = map.get("MsgType");
            String content = map.get("Content");

            session.setAttribute("requestMap",map);

            String message=null;

            System.out.println(msgType+",,,,"+map.get("Event"));

            try{

                //事件,消息自动推送
                if(Const.MsgType.MESSAGE_EVNET.equals(msgType)){
                    //获取推送事件
                    String eventType=map.get("Event");

                    //菜单点击
                    if(Const.MsgType.MESSAGE_CLICK.equals(eventType)){
                        String key=map.get("EventKey");
                        if(key.equals("sendredpack")){
                            //红包事件

                            sendRedPackController.sendRedPack(req,resp,map);
                        }

                    }

                }
                out.print(message);

            }catch (Exception e){
                e.printStackTrace();
            }finally {
                out.close();
            }

        }

     

    红包领取controller

    @Controller
    @RequestMapping("/redhandle/")
    public class SendRedPackController {

        private Logger logger = LoggerFactory.getLogger(SendRedPackController.class);

        @Autowired
        private ISendRedPackService iSendRedPackService;

        @RequestMapping(value = "sendredpack.do")
        @ResponseBody
        public void sendRedPack(HttpServletRequest req,HttpServletResponse resp,Map map) throws IOException {

           //开始发送红包
           System.out.println("红包发送开始");

           req.getInputStream();
           req.setCharacterEncoding("UTF-8");
           resp.setContentType("text/html;charset=utf-8");

           PrintWriter out = resp.getWriter();

           String message=null;

           try {
               String openId = map.get("FromUserName").toString();
               message = iSendRedPackService.sendRedPackSub(openId);
           } catch (Exception e) {
               logger.error("红包Controller异常",e);
           }
           out.print(message);

       }

    }

     

    ServiceImpl业务层

    @Service("iSendRedPackService")
    public class SendRedPackServiceImpl implements ISendRedPackService {

        public static final Logger logger = LoggerFactory.getLogger(SendRedPackServiceImpl.class);

        public static final String SENDREDPACK_URL = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack";

        @Autowired
        private IUserService iUserService;


    //String content

        public String sendRedPackSub(String openId) throws Exception {

            String respResult = null;

            //查询该用户是否关注公众号
            ServerResponse<JSONObject> response = iUserService.getUserInfo(openId);
            JSONObject jsonObject = response.getData();
            if(Integer.valueOf(jsonObject.get("subscribe").toString()) == Const.UserStatus.UN_SUBSCRIBE ){
                return respResult = "先关注后领取哦!";
            }

            SortedMap sortedMap = this.assembleSendRedPack(openId);
            String reuqestXml = SendRedPackUtil.getRequestXML(sortedMap);

            System.out.println(reuqestXml);

            String jsonStr = this.connect(reuqestXml);
            System.out.println(jsonStr);
            try {

                Document document = DocumentHelper.parseText(jsonStr);
                Element root = document.getRootElement();

                //只有当returnCode和resultCode都为SUCCESS时,红包才为发送成功
                String returnCode = root.element("return_code").getText();
                if (returnCode.equals("SUCCESS")) {
                    String result_code = root.element("result_code").getText();
                    GiveRedPack giveRedPack = null;
                    if (result_code.equals("SUCCESS")) {

                        //自己的后续操作
                        return respResult = "红包领取成功,注意查收!";
                    }
                    return respResult = "怎么没领到呢,再来一次!";
                }
            } catch (Exception e) {
                logger.error("document数据读取异常", e);
            }
            return null;
        }

        private String connect(String reuqestXml){
            FileInputStream instream = null;
            BasicHttpClientConnectionManager connManager;
            try {

                String apiUrl= "//var//tomcat//tomcat-7//webapps//mdspirit//WEB-INF//classes//cert//wxpay//yichen_cert.p12";

                File file = new File(apiUrl);
                instream = new FileInputStream(file);
                KeyStore keyStore = KeyStore.getInstance("PKCS12");
                keyStore.load(instream, PropertiesUtil.getProperty("mch_id").toCharArray());

                // 实例化密钥库 & 初始化密钥工厂
                KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
                kmf.init(keyStore, PropertiesUtil.getProperty("mch_id").toCharArray());

                // 创建 SSLContext
                SSLContext sslContext = SSLContext.getInstance("TLS");
                sslContext.init(kmf.getKeyManagers(), null, new SecureRandom());

                SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(
                        sslContext,
                        new String[]{"TLSv1"},
                        null,
                        new DefaultHostnameVerifier());

                connManager = new BasicHttpClientConnectionManager(
                        RegistryBuilder.<ConnectionSocketFactory>create()
                                .register("http", PlainConnectionSocketFactory.getSocketFactory())
                                .register("https", sslConnectionSocketFactory)
                                .build(),
                        null,
                        null,
                        null
                );

                HttpClient httpClient = null;
                try{

                    httpClient = HttpClientBuilder.create()
                            .setConnectionManager(connManager)
                            .build();
                    HttpPost httpPost = new HttpPost(SENDREDPACK_URL);
                    StringEntity postEntity = new StringEntity(new String(reuqestXml.getBytes(), "UTF-8"));
                    httpPost.addHeader("Content-Type", "text/xml");
                    httpPost.addHeader("User-Agent", USER_AGENT + " " + PropertiesUtil.getProperty("mch_id"));
                    httpPost.setEntity(postEntity);

                    HttpResponse httpResponse = httpClient.execute(httpPost);
                    HttpEntity httpEntity = httpResponse.getEntity();

                    return EntityUtils.toString(httpEntity, "utf-8");

                }catch (Exception e){
                    logger.error("红包发送连接错误",e);
                }finally {
                    connManager.close();
                    ((CloseableHttpClient) httpClient).close();
                }

            }catch (Exception e){
                logger.error("红包链接初始化错误",e);
            }finally {
                try {
                    instream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return null;
        }


        private SortedMap assembleSendRedPack(String openId) throws Exception{
            SortedMap sortedMap = new TreeMap();
            sortedMap.put("nonce_str", UUIDUtil.getUUId(PropertiesUtil.getProperty("mch_id")));  //随机字符串生成
            sortedMap.put("mch_billno", String.valueOf(generateOrderNo()));                //商户订单号生成,唯一
            sortedMap.put("mch_id", PropertiesUtil.getProperty("mch_id"));                 //商户号,微信支付分配的商户号,请不要填写APPID号
    //        sortedMap.put("sub_mch_id", PropertiesUtil.getProperty("sub_mch_id"));         //子商户号
            sortedMap.put("wxappid", PropertiesUtil.getProperty("wxappid"));               //代理商公众号
    //        sortedMap.put("msgappid", PropertiesUtil.getProperty("msgappid"));             //子商户公众号
            sortedMap.put("send_name", PropertiesUtil.getProperty("send_name"));           //商户名称
            sortedMap.put("re_openid", openId);                                            //用户openid

    //         List<RedPackType> redPackTypeList = iRedPackTypeService.selectAll().getData();
    //        RedPackType redPackType = SendRedPackUtil.getPercent(redPackTypeList);
    //        sortedMap.put("total_amount", BigDecimalUtil.mul(Double.valueOf(redPackType.getAmount().intValue()),Double.valueOf(100)));
            sortedMap.put("total_amount", PropertiesUtil.getProperty("total_amount"));
            sortedMap.put("total_num", PropertiesUtil.getProperty("total_num"));
            sortedMap.put("wishing", PropertiesUtil.getProperty("wishing"));
            sortedMap.put("client_ip", PropertiesUtil.getProperty("client_ip"));
            sortedMap.put("act_name", PropertiesUtil.getProperty("act_name"));
            sortedMap.put("remark", PropertiesUtil.getProperty("remark"));
            Integer totalAmount = Integer.valueOf(sortedMap.get("total_amount").toString());
            if(totalAmount > 20000){
                sortedMap.put("scene_id", Const.SendRedPackSceneIdEnum.PRODUCT_1.getCode());      //用户场景id,红包金额不在普通红包范围内为必填
            }
            String sign = SendRedPackUtil.generateSignature(sortedMap,SendRedPackUtil.SignType.MD5);
            sortedMap.put("sign", sign);
            return sortedMap;
        }

        private long generateOrderNo(){
            long currentTime =System.currentTimeMillis();
            return currentTime+new Random().nextInt(100);
        }

    主要的工具类:

    public class SendRedPackUtil {

        public static final String FIELD_SIGN = "sign";

        public enum SignType {
            MD5, HMACSHA256
        }

        public static String createMD5Sign(SortedMap pmap){
            StringBuilder sb = new StringBuilder();
            String stringA = "";

            Iterator<Map.Entry<String, Object>> entries = pmap.entrySet().iterator();

            while (entries.hasNext()) {

                Map.Entry<String, Object> entry = entries.next();
                stringA += ((entry.getValue() == null || entry.getValue().equals("")) ? stringA + "" : stringA + "Key = " + entry.getKey() + "&Value = " + entry.getValue());
            }

            //拼接,key为商户平台设置的密钥key
            String stringSignTemp = stringA + PropertiesUtil.getProperty("api_key");
            String sign= MD5Util.MD5Encode(stringSignTemp,"utf-8").toUpperCase();
            return sign;

        }


        public static String getRequestXML(Map<String,String> map)throws Exception{
            StringBuilder sb = new StringBuilder("<xml>");
            for(Map.Entry<String,String> en:map.entrySet()){
                String key = en.getKey();
                sb.append("<"+key+"><![CDATA[");
                sb.append(en.getValue());
                sb.append("]]></"+key+">");
            }
            return sb.append("</xml>").toString();
        }

        /**
         * 生成签名. 注意,若含有sign_type字段,必须和signType参数保持一致。
         *
         * @param data 待签名数据
         * @param signType 签名方式
         * @return 签名
         */
        public static String generateSignature(final Map<String, String> data,SignType signType) throws Exception {
            Set<String> keySet = data.keySet();
            String[] keyArray = keySet.toArray(new String[keySet.size()]);
            Arrays.sort(keyArray);
            StringBuilder sb = new StringBuilder();
            for (String k : keyArray) {
                if (k.equals(FIELD_SIGN)) {
                    continue;
                }
                if (data.get(k).trim().length() > 0) // 参数值为空,则不参与签名
                    sb.append(k).append("=").append(data.get(k).trim()).append("&");
            }
            sb.append("key=").append(PropertiesUtil.getProperty("api_key"));
            if (SignType.MD5.equals(signType)) {
                return MD5(sb.toString()).toUpperCase();
            }
            else {
                throw new Exception(String.format("Invalid sign_type: %s", signType));
            }
        }


        /**
         * 生成 MD5
         *
         * @param data 待处理数据
         * @return MD5结果
         */
        public static String MD5(String data) throws Exception {
            java.security.MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] array = md.digest(data.getBytes("UTF-8"));
            StringBuilder sb = new StringBuilder();
            for (byte item : array) {
                sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3));
            }
            return sb.toString().toUpperCase();
        }


    }

    展开全文
  • 用户通过微信扫码关注公众号获取红包 解决方案 生成带参数二维码 微信公众平台技术文档->账号管理->生成带参数的二维码 微信公众平台技术文档->消息管理->接收消息-接收事件推送->扫描带参数二维码事件 步骤 生成带...

    需求

    • 用户通过微信扫码关注公众号获取红包

    解决方案


    步骤

    • 生成带参数的二维码
    • 扫码

      • 是否关注公众号

        • 已关注,则微信会将带场景值扫描事件推送给开发者,根据场景判断当前二维码是否失效

          • 失效,公众号推送消息:当前二维码已失效
          • 未失效,获取当前扫码用户openid查询是否已经领取过红包
            1. 已领取,则公众号推送消息到微信用户通知今日已领取
            2. 未领取
              • 则调用发送红包接口,发送红包,发送成功,则存储当前微信用户信息,包含唯一 openid。
              • 设置当前扫描二维码失效
        • 未关注,则用户可以关注公众号,关注后微信会将带场景值关注事件推送给开发者

          • 根据场景值查询二维码是否失效
            • 失效,公众号推送消息:当前二维码已失效
            • 未失效,获取当前扫码用户openid查询是否已经领取过红包
              1. 已领取,则公众号推送消息到微信用户通知今日已领取
              2. 未领取
                • 则调用发送红包接口,发送红包,发送成功,则存储当前微信用户信息,包含唯一 openid。
                • 设置当前扫描二维码失效

    • 生成带参数的二维码
      • 目前有2种类型的二维码:
        • 临时二维码,是有过期时间的,最长可以设置为在二维码生成后的30天(即2592000秒)后过期,但能够生成较多数量。临时二维码主要用于帐号绑定等不要求二维码永久保存的业务场景
        • 永久二维码,是无过期时间的,但数量较少(目前为最多10万个)。永久二维码主要用于适用于帐号绑定、用户来源统计等场景。
      • 用户扫描带场景值二维码时,可能推送以下两种事件:
        1. 用户还未关注公众号,则用户可以关注公众号,关注后微信会将带场景值关注事件推送给开发者。
        2. 用户已经关注公众号,在用户扫描后会自动进入会话,微信也会将带场景值扫描事件推送给开发者。
      • 获取带参数的二维码的过程包括两步
        1. 首先创建二维码ticket
        2. 然后凭借ticket到指定URL换取二维码

    这里我们选择永久二维码


    • 然后,将TOKEN添加到请求ticket地址,进行请求
      • 成功返回说明
        {
        “ticket”:”xxx”,
        “expire_seconds”:60,
        “url”:”http:\/\/weixin.qq.com\/q\/xxx”
        }
      • 参数说明
        1. ticket :二维码ticket,凭借此ticket可以在有效时间内换取二维码
        2. expire_seconds:二维码有效时间,以秒为单位。 最大不超过2592000(即30天)
        3. url:二维码图片解析后的地址


    • 用户扫描带参数的二维码
      • 用户未关注时,进行关注后的事件推送,xml数据包
    <xml>
        <ToUserName>接收人</ToUserName>
        <FromUserName>发送人</FromUserName>
        <CreateTime>创建时间,时间戳</CreateTime>
        <MsgType>消息类型【event】</MsgType>
        <Event>事件类型【subscribe】</Event>
        <EventKey>事件KEY值,qrscene_为前缀【scan事件无此前缀,】</EventKey>
        <Ticket>二维码的ticket</Ticket>
    </xml>

      • 用户已关注时的事件推送
    <xml>
    <ToUserName><![CDATA[toUser]]></ToUserName>
    <FromUserName><![CDATA[FromUser]]></FromUserName>
    <CreateTime>123456789</CreateTime>
    <MsgType><![CDATA[event]]></MsgType>
    <Event><![CDATA[SCAN]]></Event>
    <EventKey><![CDATA[SCENE_VALUE]]></EventKey>
    <Ticket><![CDATA[TICKET]]></Ticket>
    </xml>

    *:EventKey也就是生成二维码时的场景ID,比如生成二维码时传的场景ID为 A,那么此处EventKey 则为 A


    • 知道了这个EventKEY值,
      • 查询当前二维码是否失效
    • 知道了ToUserName也就是接收人openid

      • 查询当前微信唯一openid是否存在
    • 如果当前二维码未失效,并且当前 openid 不存在数据库中,那么则可以调用发送红包接口进行红包发送。



    <xml>
        <sign><![CDATA[红包签名key]]></sign>
        <mch_billno><![CDATA[订单号]]></mch_billno>
        <mch_id><![CDATA[商户号]]></mch_id>
        <wxappid><![CDATA[公众号APPID]]></wxappid>
        <send_name><![CDATA[发送方名称]]><send_name>
        <re_openid><![CDATA[接收人openid]]></re_openid>
        <total_amount><![CDATA[红包金额]]></total_amount>
        <total_num><![CDATA[红包数量]]></total_num>
        <wishing><![CDATA[恭喜发财]]></wishing>
        <client_ip><![CDATA[调用接口的机器Ip地址]]></client_ip>
        <act_name><![CDATA[活动名称]]></act_name>
        <remark><![CDATA[备注]]></remark>
        <scene_id><![CDATA[场景值,非必须]]></scene_id>
        <consume_mch_id><![CDATA[资金授权商户号,非必须]]></consume_mch_id>
        <nonce_str><![CDATA[随机字符串]]></nonce_str>
        <risk_info>活动信息,非必须</risk_info>
    </xml>
    • 红包签名算法
    • 这里请求的时候要带上请求证书
      • 证书说明地址
      • 证书下载地址
        • 微信商户平台(pay.weixin.qq.com)–>账户设置–>API安全–>证书下载
    • 使用证书

      • 使用商户证书
        ◆ apiclient_cert.p12是商户证书文件,除PHP外的开发均使用此证书文件
        ◆ 商户如果使用.NET环境开发,请确认Framework版本大于2.0,必须在操作系统上双击安装证书apiclient_cert.p12后才能被正常调用。
        ◆ 商户证书调用或安装都需要使用到密码,该密码的值为微信商户号(mch_id)
    • 成功返回说明,xml

    <xml>
        <return_code><![CDATA[SUCCESS]]></return_code>
        <return_msg><![CDATA[发放成功.]]></return_msg>
        <result_code><![CDATA[SUCCESS]]></result_code>
        <err_code><![CDATA[0]]></err_code>
        <err_code_des><![CDATA[发放成功.]]></err_code_des>
        <mch_billno><![CDATA[00100104xxx]]></mch_billno>
        <mch_id>10010404</mch_id>
        <wxappid><![CDATA[wx6fa7e3bab7e15415]]></wxappid>
        <re_openid><![CDATA[onqOjjmM1tad-3ROpncN-yUfa6uI]]></re_openid>
        <total_amount>1</total_amount>
    </xml>

    代码见第二章


    展开全文
  • 微信公众号发红包活动

    千次阅读 2016-11-17 22:59:13
    获取成功后,返回和公众号的聊天窗口就能查看到红包了,这个界面比较丑,正在找原因。 首页index.php 获取红包页面:getRedPack.php 类库: 先上首页index.php: function pageRedrict...

    先看看效果图:





    上图这个效果,可能会有疑问,等等下边会解释为何这样的版面。





    可以到自己的零钱里看看,是不是真的领到红包了,答案是肯定的。

    为何领取红包的版面不是网上或者官方宣传的那种呢?其实是因为:


    官方说的很详细了,首先要关注公众号,并且关注的时间超过50个小时,并且还的允许接收“接收消息”,

    官方宣传的样式是防伪消息,两者的区别是这样的,真是一比较就看出差距了:


    活动说明:

    打开活动介绍界面,下边有个按钮触发抢红包事件,其实是页面跳转,在红包页面自动获取红包,

    获取成功后,返回和公众号的聊天窗口就能查到红包消息了,点击消息就可以拆红包了。


    首页index.php

    获取红包页面:getRedPack.php

    类库:

    include("WxPay.php");
    require_once "jssdk.php";
    require_once "interface/common.php";



    先上首页index.php:

    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8">
    		<meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1, user-scalable=no">
    		<title></title>
    		<script src="js/jquery-1.7.js" type="text/javascript" charset="utf-8"></script>
    		<script type="text/javascript">
    			function pageRedrict(){
    				$("#divWaiting").show();
    				document.location.replace("getRedPack.php");
    			}
    		</script>
    	</head>
    	<body style="margin: 0;padding: 0;" οnclick="closeWin()">
    		<div style="width: 100%;"><img src="img/tc_bg.png" style="width: 100%;" /></div>
    		<div οnclick="pageRedrict()" style="background-color: #c70202;color: #ffffff;margin-bottom: 50px;
    			width: 100px;margin:0 auto;text-align: center;height: 35px;margin-top:20px;line-height: 35px;">抢红包</div>
    			<div style="height: 50px;"> </div>
    			<div style="position: fixed;top:200px;left: 0;width: 100%;display: none;" id="divWaiting">
    				<div style="background: #3e3e3e;width: 200px;height: 60px;text-align: center;margin: 0 auto;color: #ffffff;line-height: 60px;border-radius: 5px;">正在获取红包...</div>
    			</div>
    			
    	</body>
    </html>
    

    getRedPack.php

    思路:

    先通过用户允许获取Code,然后通过Code获取用户OpenID,再按照规定的格式拼接字符串XML,

    然后再发送给服务器,接收服务器返回结果,因服务器返回XML格式的字符串,接收要转换为数组,

    方便针对成功和失败不同的处理方式。

    <?php
    	define('APPID', "22222");
    	define('MCHID', "33333");
    	define('PARTNERKEY', "eeeeeeeee");
    	include("WxPay.php");
    	require_once "jssdk.php";
    	require_once "interface/common.php";
    	
    	$jssdk = new JSSDK("33333333", "444444444444444");
    	$signPackage = $jssdk->GetSignPackage();
    	
    	$openid;
    	
    ?>
    <?php
    	if (isset($_GET['code'])){
    		$access_token=$jssdk->get_access_token($_GET['code']);
    		try{
    			$openid=$access_token->openid;
    //			echo $openid;
    			$token=$access_token->access_token;
    			$userinfo=$jssdk->getUserInfo($token,$openid);
    			$url= 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'];
    			
    			getwxPay($openid);
    		}
    		catch(exception $exp){
    			//header("Location:http://www.sqjushi.com/baishi/index.php");
    			echo "<script>alert('请重新打开本页面');</script>";
    		}
    	}else{
    		//echo 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'];
    		$url=$jssdk->getCode('http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING']);
    	}
    
    	function getbillno(){
    		$arr=date('Ymd',time());
    		for($i=0;$i<10;$i++){
    			$arr.=rand(0,9);
    		}
    		return MCHID."".$arr;
    	}
    	function getrandNum(){
    		return rand(0,99);
    	}
    	function getwxPay($openid){
    		$common=new common();
    		$money=100+getrandNum();//单位是分,这样处理的目的是把金额控制在1-2元之间,
    		$sender="巨石网络";
    		$obj2=array();
    		$obj2['mch_billno']="".getbillno();//订单号
    		$obj2['mch_id']="".MCHID;
    		$obj2['wxappid']="".APPID;
    		$obj2['send_name']="宿迁市巨石网络";
    		$obj2['re_openid']="".$openid;//发给谁
    		$obj2['total_amount']=$money; //金额,单位是分
    		$obj2['total_num']=1;//数量,普通红包一次只能给一个用户发送一个红包
    		$obj2['wishing']="巨石网络,技术强悍!";
    		$obj2['client_ip']="".$common->GetIP();
    		$obj2['act_name']="巨石网络红包现行";//这里有坑,好像只能是8个字,或者最多8个字,超过8个字,蛋疼的提示。
    		$obj2['remark']="不要自私,记得分享给朋友哦";
    		
    		//var_dump($obj2);
    		
    		$url='https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack';
    		$wxpayHelper=new WxPay();
    		$result=$wxpayHelper->pay($url, $obj2);
    		$temp=array();
    		$temp=$common->xmlToArray($result);
    //		echo "<script>alert('".$temp['return_msg']."');</script>";
    		if($temp['return_code']=="SUCCESS"&&$temp['return_msg']=="发放成功"){
    			echo "<script>alert('红包已经成功发送,请返回查收!');</script>";
    		}
    		else{
    			echo "<script>alert('".$temp['return_msg']."');</script>";
    			echo "<script>document.location.replace('index.php');</script>";
    		}
    		//echo "<script>alert('".$temp->return_msg."');</script>";
    //		var_dump($temp);
    
    	}
    ?>
    
    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8">
    		<meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1, user-scalable=no">
    		<title></title>
    		<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
    		<script type="text/javascript">
    			//通过config接口注入权限验证配置 
    			//, user-scalable=no
    			wx.config({
    			    //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
    			    appId: '333333333', // 必填,公众号的唯一标识
    			    timestamp: '<?php echo $signPackage['timestamp'];?>', // 必填,生成签名的时间戳
    			    nonceStr: '<?php echo $signPackage['nonceStr'];?>', // 必填,生成签名的随机串
    			    signature: '<?php echo $signPackage['signature'];?>',// 必填,签名
    			     jsApiList: [  
                      'checkJsApi',  
                      'onMenuShareTimeline',  
                      'hideOptionMenu',  
                      'onMenuShareAppMessage'  
                  ] // 必填,需要使用的JS接口列表
    			});
    			//通过ready接口处理成功验证
    			wx.ready(function(){
    				// config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后
    				function closeWin(){
    					wx.closeWindow();
    				}
    			});
    			
    		</script>
    		
    	</head>
    	<body >
    		
    	</body>
    </html>
    

    WxPay.php

    大伙研究的成果,加班熬夜都不容易,核心代码有偿提供,

    可以加QQ【705722325】索取,10块8块也是爱大笑大笑

    微信支付,好了告诉我就行了,没有标准价格,纯粹自由支付大笑大笑


    jssdk.php

    同上。

    common.php

    <?php
    class common {
    	public function GetIP() {//获取客户端IP
    		if (!empty($_SERVER["HTTP_CLIENT_IP"])) {
    			$cip = $_SERVER["HTTP_CLIENT_IP"];
    		} elseif (!empty($_SERVER["HTTP_X_FORWARDED_FOR"])) {
    			$cip = $_SERVER["HTTP_X_FORWARDED_FOR"];
    		} elseif (!empty($_SERVER["REMOTE_ADDR"])) {
    			$cip = $_SERVER["REMOTE_ADDR"];
    		} else {
    			$cip = "无法获取!";
    		}
    		return $cip;
    	}
    
    	public function xmlToArray($xml) {//xml转为数组
    		//禁止引用外部xml实体
    		libxml_disable_entity_loader(true);
    		$xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
    		$val = json_decode(json_encode($xmlstring), true);
    		return $val;
    	}
    
    }
    

    有几个坑需要注意:

    坑一、根据官方API你会打开这个网站:http://www.itrus.cn/html/fuwuyuzhichi/436.html

    因为按照要求,服务器需要支持https协议,你会发现天威诚信的邮箱服务器已经关机了,邮件根本无法发送。

    参照其他步骤做了一遍,也不知道是不是起效果了,暂且认为是有效了吧。

    坑二、控制用户领取红包数量

    微信支付|商户平台,登陆后,



    点击修改,用户领取上限,改为10个,真正领取6个就不行了,提示超限了。















    展开全文
  • #=以下为红包操作=========== class View_Wechatpy_Redpack(View): ...# 向个人用户发红包example #redpack client=WeChatPay(appid=AppID, api_key= WX_MCH_KEY, mch_id=WX_MCH_ID, mch_cert=wx_cert_path, mc...

    ==============微信服务器返回数据

    return_code->SUCCESS
              return_msg->发放成功
              result_code->SUCCESS
              err_code->SUCCESS
              err_code_des->发放成功
              mch_billno->【你的账户信息】
              mch_id->【你的账户信息】
              wxappid->【你的账户信息】
              re_openid->【接收人openid】
              total_amount->100
              send_listid->1000041701202004173001723769407

    =================以下为红包操作

    class View_Wechatpy_Redpack(View):
        def get(self,request):
            # 向个人用户发红包example
            #redpack
            client=WeChatPay(appid=AppID,
                                api_key= WX_MCH_KEY,
                                mch_id=WX_MCH_ID,
                                mch_cert=wx_cert_path,
                                mch_key=wx_key_path,
                                )
            req=client.redpack.send(
            user_id=u'o3h6juHSCuU8MubmKNBkpbYXYP1s',
            total_amount=100,
            send_name=u'转发的红包',
            act_name=u'分享没事发红包',
            wishing=u'这个红包很好玩',
            remark=u'好玩吧',
            total_num=1,
            client_ip=None,
            out_trade_no=None,
            scene_id=None,
            consume_mch_id=None,
        )
            return render(request,'logjson.html', {'req': req})
    
    
    class View_Wechatpy_Redpacklie(View):
        def get(self,request):
            # 向个人用户发裂变红包example
    
            client=WeChatPay(appid=AppID,
                                api_key= WX_MCH_KEY,
                                mch_id=WX_MCH_ID,
                                mch_cert=wx_cert_path,
                                mch_key=wx_key_path,
                                )
            req=client.redpack.send_group(
            user_id=u'o3h6juHSCuU8MubmKNBkpbYXYP1s',
            total_amount=150,
            send_name=u'你和好友都能领呦',
            act_name=u'裂变福利红包',
            wishing=u'关注万化工具领红包',
            remark=u'有点意思',
            total_num=5,
            client_ip=None,
            amt_type='ALL_RAND',
            out_trade_no=None,
            scene_id='PRODUCT_2',
            consume_mch_id=None,
    
        )
            return render(request,'logjson.html', {'req': req})
    

    样例效果如下
    代卖实现效果

    展开全文
  • 接口文档: ...amp;index=3   一、开通现金红包权限 二、下载API证书 三、充值 以上步骤请参考:https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?cha...
  •  1,微信服务号可以通过开通微信支付功能(开通条件是认证过的“服务号”)进行关注发红包;  2,微信订阅号由于不能开通支付功能,所以必须借助第三方平台、或是自身开发获取红包功能; 转载于:...
  • 本文主要介绍Java微信公众号、微信小程序、微信网页 支付和提现相关的开发流程,同时附带源码和注释,方便读者学习。
  • 在小程序里拿到了用户的openid,但是发红包调用的是公众号的,我使用小程序的appid和openid,就提示appid无效,请确保是公众号的appid 但是我使用公众号的appid和openid就提示,appid和openid不一致。因为我获取的...
  • 关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的。对于不同公众号,同一用户的openid... 导出微信公众号 用户信息包括用户openId,可以邮件:
  • map.put("re_openid", 这里填微信关注用户的openId);//微信用户 openId map.put("wishing", "恭喜发财"); map.put("send_name", "泰博科技");//商户名称 map.put("total_amount", 100);//红包金额,以分为...
  • 微信公众号微信红包开发 PHP代码

    千次阅读 2017-04-13 11:25:31
    微信公众平台现金红包开发PHP开发微信公众平台现金红包thinkPHP开发微信公众平台现金红包
  • php微信公众号发送红包功能

    千次阅读 2017-05-16 11:07:44
    用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID scope 用户授权的作用域,使用逗号(,)分隔 这里我们获取到了用户的唯一标示,openid 。 我在...
  • 微信公众号发送红包(源码)

    千次阅读 2019-02-28 10:58:36
    如果B来源为雅思哥给A66.66,如果不是雅思哥200 //在活动期间,当A推荐了B时,A不会有任何的增加积分的操作,只可以领取红包(积分加0),活动结束之后领取红包功能下线后,再有推荐即可增加积分 //B: $_GET[...
  • 1、开通现金红包功能。操作路径:【登录微信支付商户平台——>产品中心——>现金红包——>开通】 2、商户调用微信红包接口时,服务器会进行证书验证,请在商户平台下载证书 3、在发放现...
  • 用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID scope 用户授权的作用域,使用逗号(,)分隔 这里我们获取到了用户的唯一标示,openid 。 我在这里碰到...
  • 微信发红包已经成为当今比较流行的祝福形式,大家都学着使用微信发红包,这篇文章主要为大家详细介绍了PHP微信公众号自动发送红包API,感兴趣的小伙伴们可以参考一下
  • 公众号开发: 给用户发红包

    千次阅读 2018-07-31 14:09:47
    红包功能简单介绍: 1、商户调用接口时,通过指定发送对象以及发送金额的方式发放红包,这样的方式,允许商户灵活的应用于各种各样丰富的活动场景 2、领取到红包后,用户的资金直接进入微信零钱,避免繁复的领奖...
  • 微信红包管理系统可以给用户发送红包,包括回复口令领红包,分享到朋友圈领红包,以及管理员主动给粉丝发红包。 二、主要功能 1. 用户同步:同步公众号的所有用户,包含OpenID,昵称,性别,地区,头像,关注...
  • 微信服务号已开通微信支付,需要实现一个关注即给用户发送红包,不知道在哪里编辑代码,有具体的实现方法吗,开发文档看不大懂,不知道在哪实践,求大神告知。
  • 红包红包。每次群发红包为什么只能是200?原来这是腾讯做出的一个举措。群发有红包?那如果想要微信公众号红包怎么办? 其实,也是可以实现的。...公众号红包发放金额无上限、随意。企业红包最佳
  • 本demo,实现通过调用微信api接口发送公众号现金红包以及查询红包状态功能,应用场景是服务商替子商户发送现金红包(子商户模式)。普通商户模式也能使用,接口一致,参数调整一下就可以。所有功能代码都已封装好,...
  • Java后台+微信公众号红包发放实现

    千次阅读 2019-07-15 17:10:19
    微信红包代码下载出处 https://download.csdn.net/download/qq_27841461/9305817 这里apiclient_cert.p12是证书文件,获得的具体请去微信官方看。 在这个包中,需要修改的就是MoneyUtils.java 和这个 然后是...
  • 微信公众号OpenID获取

    2016-01-29 17:08:42
    本应用便于微信公众号公众号管理 自己公众号关注用户。 1.列表 显示公众号关注用户。 2. 可以以Excel形式将用户信息 发送到PC或手机上。 3. 显示微信公众号发红包 需要的用户OpenID。
  • 各位网友你们好 我是做美团外卖的商家 就是我想如何让用户关注公众号后 上传好评截图 及订单号码 实现微信公众号自动发红包 金额固定、公众号是服务号可以开通支付功能、还有一个问题 公众号 如何能自己识别订单号...
  • 本文实例讲述了PHP微信...1:先拿到关注这个粉丝的openid,openid是关注某个公众号的微信标识,这样就可以定位到这个人是订单的操作者了。 2:发送xml数据请求微信服务器。 代码有两个php文件 1.oauth2.php <?php $
  • 最近很多商家也在使用公众号给粉丝发红包,做营销活动、吸粉活动或者是反馈老用户等。 我们作为第3方开发者,就义不容辞的来给这些商家服务了。首先我们得会使用程序来写抢红包。 红包使用说明及规则,请仔细阅读 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,793
精华内容 1,517
关键字:

关注公众号发红包