2019-12-12 20:18:56 qq_31752115 阅读数 12
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

微信公众号的开发者配置中的微信开发工具中明明已经正确绑定开发者账号,但微信开发者工具还是弹出“未绑定网页开发者”,坑了好久,记录下

原因:

1.微信公众号的开发者配置中的微信开发工具中没有绑定开发者账号;

2.调用支付授权接口所传递的参数中的appid和公众服务号的appid 。

我就是第2个原因,我是查看授权接口的参数才找到appid不对号,坑了好久。找到原因后我就找到ecshop的平台后台管理系统的系统设置中的支付方式的微信支付,编辑配置对应服务号的appid ,解决完毕。

2019-08-21 01:44:48 qq_43075645 阅读数 383
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

UNIAPP打包后,继续添加修改小程序内容,发现微信开发者工具不正常打开


总是提示说登录用户不是该程序的开发者。。一点击确定就跑到微信公众平台。。。我就纳闷了,微信开发者工具都是一直都是登录我的微信,没改变过账号啊。


我找啊找,度娘翻了又翻,真的是众里寻他千百度。蓦然回首,那AppID却在,灯火阑珊处。

原来问题出现在,在HbuildX打包成微信小程序的时候,里面AppID我搞成了我的微信公众号订阅号的开发者AppID。。。。。

在这里插入图片描述

是不是很无语????我滴天啊,原来公众号里面那个开发者的基本配置的AppID是公众号的!!!!

想要让正常运转就乖乖先去放空那个方框吧。以后想上线再继续配置就行。

在这里插入图片描述

我的麻麻,微信小程序要另外重新注册,里面有自己的AppID。。。

生活如此多娇,引无数程序猿尽折腰。。。大家就要注意这些坑了,本宝宝心里苦啊,容易吗我。

到了这里你的运行微信开发者工具就一切正常啦。。。



还有一个小补充,当你想在微信开发者工具改变一个项目的AppID时,你在项目详情中直接改的话,它会提示失败

在这里插入图片描述
这里有一个办法,先把微信开发者工具中的项目删除掉,放心吧,这不会删掉本地的代码,然后新建项目,把路径写到你那个项目就行,最后在HbuildX重新运行,完美收工。

这个掌握后就不怕引入他人小程序出现AppID不对了,自己改一下就行啦。。。


好了,就介绍到这了,欢迎各位前辈指正哦,晚安了^ _ ^!!!

2017-05-01 16:41:08 y_f_raquelle 阅读数 3540
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

微信公众平台开发者文档:http://mp.weixin.qq.com/wiki/home/index.html


首先申请一个微信公众开发测试账号:http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login


申请后会提供appID和appsecret,你需要在自己的代码中添加接口配置的处理。

但此处URL必须为一个公网地址,且使用80端口,这就涉及到之前讲到的公网映射的方式。通常使用ngrok,注册后获得authtoken并配置,使用ngrok http <port>即可将指定端口映射到公网80端口。

接口配置的java示例:(参考Journey的博客

@WebServlet(urlPatterns = "/wx", name = "wxHouseKeeperServlet")  
public class HouseKeeper extends HttpServlet {  
    public static final String TOKEN = "mzmzo";  
  
    @Override  
    protected void doGet(HttpServletRequest request, HttpServletResponse response)  
            throws ServletException, IOException {  
        try {  
            // 开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数  
            String signature = request.getParameter("signature");// 微信加密签名(token、timestamp、nonce。)  
            String timestamp = request.getParameter("timestamp");// 时间戳  
            String nonce = request.getParameter("nonce");// 随机数  
            String echostr = request.getParameter("echostr");// 随机字符串  
            PrintWriter out = response.getWriter();  
            // 将token、timestamp、nonce三个参数进行字典序排序  
            String[] params = new String[] { TOKEN, timestamp, nonce };  
            Arrays.sort(params);  
            // 将三个参数字符串拼接成一个字符串进行sha1加密  
            String clearText = params[0] + params[1] + params[2];  
            String algorithm = "SHA-1";  
            String sign = new String(  
                    Hex.encodeHex(MessageDigest.getInstance(algorithm).digest((clearText).getBytes()), true));  
            // 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信  
            if (signature.equals(sign)) {  
                response.getWriter().print(echostr);  
            }  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }     
}  

此处TOKEN与网页中填写的Token一致即可

接下来配置“网页授权获取用户基本信息


注意填写时不用加http://,只填写域名即可。

完成后扫描下方二维码即可关注自己的公众测试号,网页中会显示关注用户的Openid。

下载微信Web开发工具,即可模拟手机调试


完成登录和绑定后,开发者就可以开始调试微信网页授权,在地址栏直接输入URL

示例: https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx841a97238d9e17b2&redirect_uri=http://cps.dianping.com/weiXinRedirect&response_type=code&scope=snsapi_base&state=type%3Dquan%2Curl%3Dhttp%3A%2F%2Fmm.dianping.com%2Fweixin%2Faccount%2Fhome

这里appid填写之前注册后得到的,redirect_uri指向自己的公网域名下的url,response_type为code,scope为snsapi_base表示静默授权,state填写uri后的mapping。注意这里的redirect_uri和state可能需要urlencode。








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

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

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

最近在搞微信的开发者模式,对于第一次接触这东西的人来说还真是没有头绪,因为需要跟微信进行交互,难免会碰到一些问题,不像我们在本机开发那样,很快就能把逻辑代码写完。今天主要是让测试耽误了时间,由于微信只能绑定域名,不能使用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


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

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

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

微信测试账号申请

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

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

打开网址扫码登陆 :

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

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

在这里插入图片描述

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