2019-04-02 23:01:34 weixin_38361347 阅读数 90
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27761 人正在学习 去看看 秦子恒

微信测试账号申请

由于用户体验和安全性方面的考虑,微信公众号的注册有一定门槛,某些高级接口的权限需要微信认证后才可以获取。

所以,为了帮助开发者快速了解和上手微信公众号开发,熟悉各个接口的调用,我们推出了微信公众帐号测试号,通过手机微信扫描二维码即可获得测试号。

打开网址扫码登陆 :

https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421137522

然后设置自己的服务器地址和 token

在这里插入图片描述

2019-06-10 11:35:28 philip502 阅读数 3517
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27761 人正在学习 去看看 秦子恒

小程序消息推送至公众号(服务号)

可以通过小程序openid推送到公众号(服务号),要求如下

  1. 小程序和公众号的主体需要保持一致

  2. 在公众号中需要关联小程序;

消息模板

消息模板库中的模板在不同公众号引用后会生成不同的消息模板id;

 

小程序提交审核

小程序在提交审核的时候需要提交对应的测试账号和密码(非微信登录的场景);

小程序在提交审核之前有三次免费改名的机会,一旦提交审核通过后,每次修改名称需要缴纳300元服务费;

小程序头像一年内只可以修改5次

类别可以随时修改;

提交审核周期:1-3天

 

公众号-服务号消息模板

消息模板现在是以插件的方式提供,申请使用消息模板插件后,需要微信官方审核,着急用的话需要提前申请审核

 

UnionID

微信公众平台更新,为开发者提供UnionID机制

经开发者反馈,由于同一公司下多个公众号之间需要用户帐号互通,微信开放平台提供了UnionID机制,来解决此问题。

通过获取用户基本信息接口,开发者可通过OpenID来获取用户基本信息,而如果开发者拥有多个公众号,可使用以下办法通过UnionID机制来在多公众号之间进行用户帐号互通。

1. 将多个公众号绑定到同一个微信开放平台(open.weixin.qq.com)帐号下,即同一个Union下

2. 通过获取用户基本信息接口中的UnionID来区分用户的唯一性,不过需要注意的是:公众号只有在被绑定到微信开放平台帐号下后,才会获取UnionID。只要是同一个微信开放平台帐号下的公众号,用户的UnionID是唯一的。换句话说, 同一用户,对同一个微信开放平台帐号下的不同应用,UnionID是相同的。

 

下图是微信小程序在提交审核时候如果采用的自有的账号体系,需要给微信审核提供测试账号

测试账号需要拥有所有的功能权限

 

这个描述需要小程序开发人员在build到微信小程序后台的时候填写的备注

 

2018-03-21 22:49:11 u014740338 阅读数 2437
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27761 人正在学习 去看看 秦子恒

最近在搞微信的开发者模式,对于第一次接触这东西的人来说还真是没有头绪,因为需要跟微信进行交互,难免会碰到一些问题,不像我们在本机开发那样,很快就能把逻辑代码写完。今天主要是让测试耽误了时间,由于微信只能绑定域名,不能使用ip地址,但是在公司中域名直接解析到线上服务器,但是线上服务器该域名下已经有服务在运行,所以不能使用线上服务器直接进行开发测试,也不能把已有的服务号打开开发者模式,因为打开开发者模式之后好多已有的自动回复就不能使用了,总之遇到了各种问题,记录下开发过程。


申请测试账号

进入申请地址:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

点击登录按钮,会弹出一个二维码,使用手机微信扫描即可

登录成功之后会出现下面的界面


appID和appsecret在调用微信接口的时候会用到,这里是微信自动给我们生成好的,直接使用就可以。

URL:是我们自己服务器的URL,用户微信推送用户消息和事件用的。这里只能配置域名,不能使用IP。这个URL是用来接收微信的token认证和消息事件用的,我们自己的服务器要能对这个url的请求进行处理并相应,所以要求该域名必须是外网可以访问的,否则在点“提交”按钮的时候会报token异常。

Token:是验证签名用的,此处填写的要与代码中的Token保持一致否则验证不过。

URL和Token都填好之后点击提交按钮,若验证通过,会返回配置成功,否则返回配置失败。

配置失败的原因可能有几个:

1、URL地址不能访问

2、Token填写错误

注意:在点击提交按钮之前一定要先把服务端的代码写好,否则会返回配置失败,具体实现代码在后面演示。

到此为止,我们的接口配置信息就算完成了。

扫描测试号二维码就可以来测试我们的功能了


Token认证

我配置的URL是,http://www.xxx.com/XX/wxProcess/service,所以微信会把所有的请求都发到我的/service路径上,包括Token认证和事件处理,我使用两个方法来处理的,但是请求类型不同,Token认证是用的GET请求,事件处理使用的是POST请求。演示代码如下:

/**
     * 打开开发者模式签名认证
     * @param signature
     * @param timestamp
     * @param nonce
     * @param echostr
     * @return
     */
    @ResponseBody
    @RequestMapping(value = "/service", method = RequestMethod.GET)
    public Object defaultView(String signature, String timestamp, String nonce, String echostr) {
        if (echostr == null || echostr.isEmpty()) {
            return nonce;
        }
        if (SignUtil.checkSignature(signature, timestamp, nonce)) {
            return echostr;
        }
        return nonce;
    }

    /**
     * 事件处理
     * @param signature
     * @param timestamp
     * @param nonce
     * @param message
     * @return
     */
    @ResponseBody
    @RequestMapping(value = "/service", method = RequestMethod.POST, consumes = "text/xml", produces = "text/xml;charset=UTF-8")
    public String defaultViewHandler(String signature, String timestamp, String nonce, @RequestBody String message) {
        String result = "";
        if (SignUtil.checkSignature(signature, timestamp, nonce)) {
            result = coreService.processRequest(message);
        }
        return result;
    }

做签名认证的时候会调用我的defaultView方法,其他的事件都走defaultViewHandler方法。

coreService.processRequest(): 是对所有的请求事件进行处理

CoreService.java主要代码实现如下:

@Override
    public String processRequest(String msg) {
        String respMessage = null;
        try {
            // 默认返回的文本消息内容
            String respContent = "";

            // xml请求解析
            Map<String, String> requestMap = MessageUtil.parseXml(msg);

            // 发送方帐号(open_id)
            String fromUserName = requestMap.get("FromUserName");
            // 公众帐号
            String toUserName = requestMap.get("ToUserName");
            // 消息类型
            String msgType = requestMap.get("MsgType");
            String eventType = requestMap.get("Event");

            // 存在事件类型且类型有效 或者 消息类型可以处理,才需要进行身份处理,防止没有意义的事件引起发送大量绑定消息
            if ((!StringUtils.isEmpty(eventType) && !eventArrays.contains(eventType)) || !msgArrays.contains(msgType)) {
                return "";
            }

            respMessage = handleWxMessage(requestMap);
        } catch (Exception e) {
            LOGGER.error("error", e);
            e.printStackTrace();
        }
        return respMessage;
    }

    @Override
    public String handleWxMessage(Map<String, String> requestMap) {
        // 发送方帐号(open_id)
        String fromUserName = requestMap.get("FromUserName");
        // 公众帐号
        String toUserName = requestMap.get("ToUserName");
        // 消息类型
        String msgType = requestMap.get("MsgType");
        // 回复文本消息
        String respContent = "";
        BaseMessage textMessage = new TextMessage();
        textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);
        switch (msgType) {
            case MessageUtil.REQ_MESSAGE_TYPE_TEXT:
                // 文本类型消息,暂时设置成用户发什么就回复什么
                String content = requestMap.get("Content");
                respContent = "";
                break;
            case MessageUtil.REQ_MESSAGE_TYPE_VOICE:
                // 使用语音识别功能需要开启微信公众号相关权限
                // 语音识别结果
                String recognizeText = requestMap.get("Recognition");
                respContent = "";
                break;
            case MessageUtil.REQ_MESSAGE_TYPE_EVENT:
                // 事件类型
                String eventType = requestMap.get("Event");
                // 事件KEY值,qrscene_为前缀,后面为二维码的参数值
                String eventKey = requestMap.get("EventKey");
                // 自定义事件
                switch (eventType) {
                    // 用户未关注时,进行关注后的事件推送
                    case MessageUtil.EVENT_TYPE_SUBSCRIBE:
                        if (isUserBuyLastActivity(fromUserName)) {
                            textMessage = getAddClassTextMessage(fromUserName);
                        } else {
                            textMessage = getDefaultTextMessage(fromUserName);
                        }
                        Integer eventKeyValue = 1;// 带参数的情景值
                        if (!StringUtils.isEmpty(eventKey) && eventKey.contains("qrscene_")) {
                            eventKey = eventKey.replace("qrscene_", "");
                            // 渠道ID
                            eventKeyValue = Integer.parseInt(eventKey);
                        }
                        subscribeAction(fromUserName, eventKeyValue);
                        break;
                    // 取消关注
                    case MessageUtil.EVENT_TYPE_UNSUBSCRIBE:
                        unSubscribeAction(fromUserName);
                        break;
                    // 用户已关注时的事件推送
                    case MessageUtil.EVENT_TYPE_SCAN:
                        textMessage = getDefaultTextMessage(fromUserName);
                        break;
                    default:
                        respContent = "";
                        break;
                }
                break;
            default:
                respContent = "";
                break;
        }

        if (textMessage instanceof TextMessage) {
            // 文本内容为空且是文本消息返回空字符串,防止微信发送异常消息
            String content = ((TextMessage) textMessage).getContent();
            if (StringUtils.isEmpty(respContent) && StringUtils.isEmpty(content)) {
                return "";
            }
            if (org.apache.commons.lang.StringUtils.isBlank(content)) {
                ((TextMessage) textMessage).setContent(respContent);
            }
        }
        textMessage.setToUserName(fromUserName);
        textMessage.setFromUserName(toUserName);
        textMessage.setCreateTime(new Date().getTime());
        String xmlString = MessageUtil.messageToXml(textMessage);
        return xmlString;
    }

上面只是展示了部分核心代码,具体代码可以去我的GitHub下载,地址:https://github.com/liuyanmin/wxDemo

下面是微信开发相关的链接:

申请个人测试账号:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

微信被动回复消息开发文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140543

微信错误码文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140543


2018-01-18 14:19:45 BuFanQi_Info 阅读数 380
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27761 人正在学习 去看看 秦子恒

公众号

本文笔者采用的公众号为订阅号,开发为微信测试号

公众号申请

笔者可在微信公众平台申请公众号

测试号申请

  • 申请测试号
    这里写图片描述
    这里写图片描述

开发配置

公众号基础配
模板消息配
API接口权限
网页授权配置

2016-01-19 11:17:58 CSDNones 阅读数 1360
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27761 人正在学习 去看看 秦子恒
从零开始开发微信公众号系列片将会讲述微信账号申请,微信各个接口的实现,同时会为每个接口提供实现的demo。同时,此系列博文也不乏引用博友的一些思想内容,如有问题,欢迎联系于我,谢谢!由于该系列博文是工作之余总结的,有时没及时更新还望博友监督,提醒以达到共勉。俗话说,磨刀不误砍柴工,要进行微信公众号开发首先你得做好以下准备工作,那现在我们先来磨刀。很多人为微信开发账号发愁,这一点不用担心,腾讯还是挺人性化的,作为开发者可以申请测试号来进行微信公众号开发,这样我们就可以不用花冤枉钱去申请微信的订阅号和服务号了,也可以省去认证账号这些步骤。通过测试号,我们可以很方便的开发。测试号公开了基础和高级接口,除了微信支付和微信小店接口未开通。(开放接口如下图)

\

  言归正传:怎样申请微信公众平台接口测试帐号?

  1.使用你的手机号注册个微信账号

  2.进入微信测试号网址点击登录 http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

\

  3.用手机登录你的微信,使用微信中的“扫一扫”功能,扫描上面网页中的二维码,在手机上会出现以下界面并点击确认登录

\  4.点击“确认登录”按钮,回到电脑的网页,网页将变为

\

  5.网页中提供了测试的微信号,及二维码等信息。填写微信帐号连接的URL网址,输入你的Token(任意字符串,必须与你的URL网页中的Token值相同)输入完毕后,点击“提交”按钮。连接成功后,将看到以下页面

\

  6.在手机微信号扫描网页中的二维码,可以将你的公众测试帐号添加到微信的订阅号里了

  \

\

\

注意事项

  • 申请开发测试帐号前,必须要有一个自己的域名空间,以用来写微信接口代码

  至此,申请测试号工作完成,刀已磨好准备开杀戒了!你准备好了吗?

没有更多推荐了,返回首页