微信开发者工具 调起支付_微信开发工具微信支付白名单 - CSDN
  • 微信支付本地调试

    万次阅读 2015-12-13 22:30:21
    经过折腾几天,找了一些... 这几天收集了一些问题记录一下,之前一直以为需要测试微信支付备案才能调试这个支付接口。在知乎达人解答后,发现可以用代理的方式来处理本地调试。我购买了一个腾讯云 申请一个域名绑定了

    经过折腾几天,找了一些资料来看。我不得不吐槽微信这个团队在做文档是如何槽糕,文档做的不好其次,接口那些总体而言 让人感觉很难受,而且给出的方案不是最优而是最麻烦的,和开发者互动很少。
    开放平台像是一个爱理不理的平台。
    这几天收集了一些问题记录一下,之前一直以为需要测试微信支付备案才能调试这个支付接口。在知乎达人解答后,发现可以用代理的方式来处理本地调试。

    我购买了一个腾讯云 申请一个域名绑定了,但这个备案过程很让人难受。现在需要做的事情只有等待,等待。

    参考资料如下:

    http://www.zhihu.com/question/25456655

    搭建微信公众平台开发测试环境
    http://www.pizida.com/weixin-test.html

    http://www.yingxukang.com/list.asp?ID=930
    搭建微信公众平台开发测试环境

    微信支付调用支付jsapi缺少参数:timeStamp错误解决方法
    http://www.0576w.com/asp-weixin-22133.html
    (这个错,是官方的sdk 案例 的错误,在一些途径下载的时候发现还是旧版本所以出现这些奇怪的问题)

    这次我使用知乎的代理的方式,加上设置ipad机器和Fiddler 来完成一个测试。
    但是发现官网给出的案例有错误,上次测试没有发现,很让人纠结。发现直接干脆改成了手动写。这样调试又没错了。

    微信支付第一个支付案例是测试支付一分钱,但是官方提供的sdk 很不简洁,用起来不是太舒服。其他网友封装了php 效果比官方提供的更加友善。

    1.开发环境搭配

    1 使用PHP IDE 是 JetBrains PhpStorm ,环境安装XAMPP 、代理调试是用Fiddler 这个 这几个工具配搭本地开发。

    PhpStorm 真心不错,可惜要收费,只能暂时用一下。

    参考的库 除了微信的SDK 版本,真心不觉得微信在这块提供的支持能力有多大,特别社区和开发者互动性太少了。否则不会出现这么的问题。心里都明白,他们看得见只是说不出吧。

    下面一个不错的库,虽然不会php 看到里面一些写法和设计比官网的sdk 好太多了。至少不会出现各种蛋疼的问题。
    https://github.com/thenbsp/wechat

    2.使用微信支付的问题

    参考资料

    http://blog.csdn.net/truong/article/details/47362397
    《微信支付 chooseWXPay 和WeixinJSBridge 区别 》 当时一直使用v2 现在有v3了 直接改用v3好了。

    《thinkphp整合微信支付,绝对可行》
    http://www.inotcare.com/art/xinde/php/18.html

    一些 openid 的cookite的缓存做法,效果还是可以 扩展了思维 。一直关于session 和cookie 之间的说法,有一些人说可以 有一些人 不可以。

    2015 年 12-13 日
    今天使用了微信的V3接口,真心遇到了不少坑,还有不少注意的地方。只能说微信文档官网懒得没人说。

    问题一 :出现了 微信支付开发-当前页面的URL未注册?
    出现了 微信支付开发-当前页面的URL未注册情况,我做了一个尝试,在设置微信测试支付的目录里面,我的显示页面不在授权目录当中,导致一个问题就是支持不成功出现了这种情况,于是我改用了授权目录的页面内则支付调用成功了。

    问题二:PHP file_get_contents 保存json的问题 一直找不到路径
    看到有人写了这个 DIR 于是改用 (DIR.”/log/jsapi_ticket.json”) 这个路径作使用使用则处理了问题

    微信支付开发-当前页面的URL未注册

    3.第三方开发库

    https://github.com/biangbiang/wxpay-php

    https://github.com/thenbsp/wechat

    展开全文
  • 参考公众号支付开发者文档我们要做的就是上图标红的部分。具体代码实现如下:depositPay.jsp(/wechat/jsapisign部分的验签在这里就不讲述了,在微信公众号开发之调起微信扫一扫接口中有详细介绍)<%@ page ...

    参考公众号支付开发者文档


    我们要做的就是上图标红的部分。

    理一遍流程:

    1.进行js-sdk的验签流程

    2.发起请求,对统一下单的传入参数进行参数签名,签名通过后,把签名也封装到参数中

    3.调起微信统一下单接口,生成预订单(在公司已经申请了商户号的前提下,商户的申请配置在这里就不讲述了,自行百度。值得注意的是支付的授权目录为支付请求的上一级目录,要请求的全路径)

    4.在预订单中取出prepay_id(生成预订单主要目的就是这个prepay_id,能得到prepay_id就已经成功一半了)

    5.获得prepay_id后,调起微信支付 wx.chooseWXPay({});(业务逻辑根据项目需求自行处理)

    6.支付成功后,回调支付成功通知,通知微信支付结果(业务逻辑根据项目需求自行处理)

    具体代码实现如下:

    depositPay.jsp(/wechat/jsapisign部分的验签在这里就不讲述了,在微信公众号开发之调起微信扫一扫接口中有详细介绍)

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
        <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
        <link rel="stylesheet" href="../../../resources/css/example.css"/>
        <link rel="stylesheet" href="../../../resources/css/weui.min.css"/>
        <script src="http://res.wx.qq.com/open/js/jweixin-1.1.0.js"></script>
        <script src="../../../resources/js/jquery.min.js"></script>
        <title>押金支付</title>
    </head>
    <body>
    <div class="container">
        <div class="page__bd">
            <div class="weui-btn-area" style="padding-top: 40px;">
                <button class="weui-btn weui-btn_primary" id="deposit">押金充值</button>
            </div>
        </div>
    </div>
    <script type="text/javascript">
        $.ajax({
            url: "${pageContext.request.contextPath}/wechat/jsapisign",
            type: "post",
            data: {
                url: location.href.split('#')[0]
            },
            contentType: 'application/x-www-form-urlencoded;charset=utf-8',
            async: true,
            success: function (data) {
                wx.config({
                    debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
                    appId: data.appid, // 必填,公众号的唯一标识
                    timestamp: data.timestamp, // 必填,生成签名的时间戳
                    nonceStr: data.nonceStr, // 必填,生成签名的随机串
                    signature: data.signature,// 必填,签名,见附录1
                    jsApiList: ["chooseWXPay"] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
                });
            }
        });
        wx.ready(function () {
            document.querySelector("#deposit").onclick = function () {
                $.ajax({
                    url: "${basePath}/wechat/paySubmit?totalFee=1&openId=${openid}&outTradeNo=${outTradeNo}",
                    type: "get",
                    dataType: "json",
                    success: function (result) {
                         wx.chooseWXPay({
                            timestamp: result.timeStamp, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
                            nonceStr: result.nonceStr, // 支付签名随机串,不长于 32 位
                            package: "prepay_id=" + result.prepay_id,
                            signType: 'MD5', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
                            paySign: result.paySign, // 支付签名
                            success: function (res) {
                               window.location.href="${basePath}/wechat/paySuccess"
                            }
                         });
                    },
                    error: function (data) {
                        alert(data);
                    }
                })
            }
        });
    </script>
    </body>
    </html

    /wechat/paySubmit请求的详细代码,统一下单的请求和返回参数参照微信公众号支付统一下单部分

    统一下单接口为:"https://api.mch.weixin.qq.com/pay/unifiedorder"

     @RequestMapping(value = "/pay", method = RequestMethod.GET, produces = MEDIATYPE_CHARSET_JSON_UTF8)
        public @ResponseBody String pay(HttpSession httpSession, HttpServletRequest request, String totalFee, String openId, String outTradeNo) {
    	String paramContent = "";
            String sign = "";
    	String nonceStr = CheckUtil.generateNonceStr();
    	Map<String, String> param = new HashMap<>();
            param.put("appid", appId); //公众号id
            param.put("mch_id", mchId);//商户平台id
            param.put("device_info", "WEB");
            param.put("nonce_str", nonceStr);      
            param.put("body", "xiaodoujieyue");//订单标题
            param.put("out_trade_no", outTradeNo);//订单ID
            param.put("total_fee", totalFee); //订单需要支付的金额
            param.put("trade_type", "JSAPI");//交易类型 JSAPI 公众号支付 NATIVE 扫码支付 APP APP支付        
            param.put("notify_url", WXConstants.BASE_SERVER+"/wechat/payNotify");//notify_url 支付成功之后 微信会进行异步回调的地址
            param.put("openid", openId);//微信授权获取openId
            param.put("sign_type", "MD5");
    	String spbill_create_ip = CheckUtil.getIpAddr(request);
    	if (StringUtils.isEmpty(spbill_create_ip)) {
    		map.put("spbill_create_ip", "192.168.0.1");// 消费IP地址
    	} else {
    		map.put("spbill_create_ip", spbill_create_ip);// 消费IP地址
    	}
            sign = CheckUtil.generateSignature(param, key, "MD5");
            param.put("sign", sign);
            paramContent = CheckUtil.getXMLFromMap(param);
            logger.info("预订单参数信息" + paramContent);
            String orderInfo = OkHttpUtil.getInstance().doPost("https://api.mch.weixin.qq.com/pay/unifiedorder", paramContent);
            logger.info("生成预订单的信息xml" + orderInfo);
    	String prepay_id;
    	try {
                Map<String, String> orderInfoMap = CheckUtil.xmlToMap(orderInfo);
                if (orderInfoMap.get("return_code").equals("SUCCESS") && orderInfoMap.get("result_code").equals("SUCCESS")) {
                    //预支付id
                    prepay_id = orderInfoMap.get("prepay_id");
                    String timestamp = CheckUtil.create_timestamp();
                    HashMap<String, String> pageParam = new HashMap<>();
                    pageParam.put("appId", appId);
                    pageParam.put("nonceStr", nonceStr);
                    pageParam.put("package", "prepay_id=" + prepay_id);
                    pageParam.put("timeStamp", timestamp);
                    pageParam.put("signType", "MD5");
                    String pageSign = CheckUtil.generateSignature(pageParam, key, "MD5");
                    pageParam.put("paySign", pageSign);
                    pageParam.put("prepay_id", prepay_id);
                    logger.info("参与签名的参数:appId:" + appId + "nonceStr:" + nonceStr + "package:prepay_id=" + prepay_id + "timeStamp" + timestamp + "signType:MD5" + "paySign:" + pageSign);                
    		return JSON.toJSONString(pageParam);
    	    }
            } catch (Exception e) {
                logger.error("生成的预订单格式xml转map异常" + e.getMessage() + "异常原因" + e.getCause());
                return null;
            }
            return null;
        }

    支付回调  

    @RequestMapping("/payNotify")
        public synchronized String payNotify(HttpServletRequest request, HttpServletResponse response) {
            Map<String, String> returnData = new HashMap<>();
            String returnXML = "";
            String retStr = "";
            try {
                retStr = new String(readInput(request.getInputStream()), "utf-8");
            } catch (IOException e) {
                e.printStackTrace();
            }
            logger.info("支付回调信息:" + retStr);
            try {
                Map<String, String> responseResult = CheckUtil.xmlToMap(retStr);
                String localSign = CheckUtil.generateSignature(responseResult, key, "MD5");
                String sign = responseResult.get("sign");
                String openid = responseResult.get("openid");
                logger.info("签名信息:localSign-->" + localSign + "sign:-->" + sign);
                if (Objects.equals(sign, localSign)) {
                    if (!responseResult.get("return_code").toString().equals("SUCCESS") || !responseResult.get("result_code").toString().equals("SUCCESS")) {
                        returnData.put("return_code", "FAIL");
                        returnData.put("return_msg", "return_code不正确");
                    } else {
    				   //todo 你的业务逻辑
                       returnData.put("return_code", "SUCCESS");
                       returnData.put("return_msg", "ok");                 
                    }
                } else {
                    returnData.put("return_code", "FAIL");
                    returnData.put("return_msg", "签名错误");
                }
            } catch (Exception e) {
                logger.error("支付回调错误" + e.getMessage());
                returnData.put("return_code", "FAIL");
                returnData.put("return_msg", "支付回调失败");
                returnXML = CheckUtil.getXMLFromMap(returnData);                 
    			return returnXML;
            }
    		returnXML = CheckUtil.getXMLFromMap(returnData);                 
            logger.info("支付回调返回的信息" + returnXML);
            return returnXML;
        }
        public static byte[] readInput(InputStream in) throws IOException {
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            int len = 0;
            byte[] buffer = new byte[1024];
            while ((len = in.read(buffer)) > 0) {
                out.write(buffer, 0, len);
            }
            out.close();
            in.close();
            return out.toByteArray();
        }

    用到的工具类 CheckUtil.java

    public class CheckUtil {
    	/**
         * 生成签名. 注意,若含有sign_type字段,必须和signType参数保持一致。
         * @param data 待签名数据
         * @param key API密钥
         * @param signType 签名方式
         * @return 签名
         */
        public static String generateSignature(final Map<String, String> data, String key, 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(WXPayConstants.FIELD_SIGN)) {
                    continue;
                }
                if (data.get(k).trim().length() > 0) // 参数值为空,则不参与签名
                    sb.append(k).append("=").append(data.get(k).trim()).append("&");
            }
            sb.append("key=").append(key);
            if (SignType.MD5.equals(signType)) {
                return MD5(sb.toString()).toUpperCase();
            }
            else if (SignType.HMACSHA256.equals(signType)) {
                return HMACSHA256(sb.toString(), key);
            }
            else {
                throw new Exception(String.format("Invalid sign_type: %s", signType));
            }
        }
    	 /**
         * 通过HttpServletRequest返回IP地址
         * @param request HttpServletRequest
         * @return ip String
         * @throws Exception
         */
        public static String getIpAddr(HttpServletRequest request) throws Exception {
            String ip = request.getHeader("x-forwarded-for");
            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getHeader("Proxy-Client-IP");
            }
            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getHeader("WL-Proxy-Client-IP");
            }
            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getHeader("HTTP_CLIENT_IP");
            }
            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getHeader("HTTP_X_FORWARDED_FOR");
            }
            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getRemoteAddr();
            }
            return ip;
        }
    	public static String generateNonceStr() {
            return UUID.randomUUID().toString().replaceAll("-", "").substring(0, 32);
        }
    	public static String getXMLFromMap(Map<String, String> map) throws Exception {
            StringBuffer sb = new StringBuffer();
            sb.append("<xml>");
            Set<String> set = map.keySet();
            Iterator<String> it = set.iterator();
            while (it.hasNext()) {
                String key = it.next();
                sb.append("<" + key + ">").append(map.get(key)).append("</" + key + ">");
            }
            sb.append("</xml>");
            return sb.toString();
        }
        /**
         * XML格式字符串转换为Map
         *
         * @param strXML XML字符串
         * @return XML数据转换后的Map
         * @throws Exception
         */
        public static Map<String, String> xmlToMap(String strXML) throws Exception {
            try {
                Map<String, String> data = new HashMap<String, String>();
                DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
                DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
                InputStream stream = new ByteArrayInputStream(strXML.getBytes("UTF-8"));
                org.w3c.dom.Document doc = documentBuilder.parse(stream);
                doc.getDocumentElement().normalize();
                NodeList nodeList = doc.getDocumentElement().getChildNodes();
                for (int idx = 0; idx < nodeList.getLength(); ++idx) {
                    Node node = nodeList.item(idx);
                    if (node.getNodeType() == Node.ELEMENT_NODE) {
                        org.w3c.dom.Element element = (org.w3c.dom.Element) node;
                        data.put(element.getNodeName(), element.getTextContent());
                    }
                }
                try {
                    stream.close();
                } catch (Exception ex) {
                    // do nothing
                }
                return data;
            } catch (Exception ex) {
                throw ex;
            }
        }
        public static String create_timestamp() {
            return Long.toString(System.currentTimeMillis() / 1000);
        }
    }

    OkHttpUtil.java

    public class OkHttpUtil {
        private static OkHttpUtil okHttpUtil;
        private static OkHttpClient okHttpClient;
        private OkHttpUtil() {
            /**
             * OkHttp是一个第三方类库,
             * 用于android中请求网络
             * 创建OkHttpClient对象
             */
            okHttpClient = new OkHttpClient();
        }
        public static OkHttpUtil getInstance() {
            if (okHttpUtil == null) {
                okHttpUtil = new OkHttpUtil();
            }
            return okHttpUtil;
        }
    
        public String doGet(String url) {
            /**
             * 请求接口
             * 创建Request对象
             */
            Request request = new Request.Builder()
                    .url(url)
                    .build();
            //得到request对象
            Call call = okHttpClient.newCall(request);
            try {
                Response response = call.execute();
                return response.body().string();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
    
        public String doPost(String url, Map<String, String> param) {
            FormBody.Builder builder = new FormBody.Builder();
            for (Map.Entry<String, String> entry : param.entrySet()) {
                builder.add(entry.getKey(), entry.getValue());
            }
            RequestBody body = builder.build();
            Request request = new Request.Builder()
                    .url(url)
                    .post(body)
                    .build();
            Call call = okHttpClient.newCall(request);
            try {
                Response response = call.execute();
                return response.body().string();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
    
        public String doPostParam(String url, Map<String, Object> param) {
            FormBody.Builder builder = new FormBody.Builder();
            for (Map.Entry<String, Object> entry : param.entrySet()) {
                builder.add(entry.getKey(), (String) entry.getValue());
            }
            RequestBody body = builder.build();
            Request request = new Request.Builder()
                    .url(url)
                    .post(body)
                    .build();
            Call call = okHttpClient.newCall(request);
            try {
                Response response = call.execute();
                return response.body().string();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
    
        public String doPost(String url, String param) {
            MediaType JSON = MediaType.parse("application/json; charset=utf-8");
            RequestBody body = RequestBody.create(JSON, param);
            Request request = new Request.Builder()
                    .url(url)
                    .post(body)
                    .build();
            Call call = okHttpClient.newCall(request);
            try {
                Response response = call.execute();
                return response.body().string();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
    }
    


    展开全文
  • 微信公众平台支付接口调试工具

    千次阅读 2018-08-09 16:48:23
    https://pay.weixin.qq.com/wiki/tools/signverify/
    展开全文
  • 如何调取支付页面,如下图: 在微信浏览器里面打开H5网页中执行JS调用支付。 getBrandWCPayRequest参数及返回值的定义: 1)请求参数值说明: 微信调用请求参数(json格式) 名称 变量名 必填 类型 ...

    如何调取支付页面,如下图: 

     在微信浏览器里面打开H5网页中执行JS调用支付。

    getBrandWCPayRequest参数及返回值的定义:

    1)请求参数值说明:

    微信调用请求参数(json格式)
    名称 变量名 必填 类型 示例值 描述
    公众号 appId String(16) wx66666666666666 商户注册具有支付权限的公众号成功后即可获得
    时间戳 timeStamp String(32) 1414561699 当前的时间戳
    随机字符串 nonceStr String(32)

    5K8264ILTKCH16C

    Q2502SI8ZNMTM67VS

    随机字符串
    订单详情扩展字符串 pageage String(128) prepay_id=123456789 统一下单接口返回的prepay_id参数值,提交格式如:prepay_id=***
    签名方式 signType String(32) MD5 签名类型,默认为MD5,支持HMAC-SHA256和MD5。注意此处需与统一下单的签名类型一致
    签名 paySign String(64)

    C380BEC2BFD727A

    4B6845133519F3AD6

    Q签名,详见签名生成算法

    2)返回结果值说明:

    微信调用返回参数
    返回值 描述
    get_brand_wcpay_request:ok 支付成功
    get_band_wcpay_request:cancel 支付过程中用户取消支付
    get_band_wcpay_request:fail 支付失败
    调用支付JSAPI缺少参数:total_fee

    1、请求检查预支付会话标识prepay_id是否已失效

    2、请求的appId与下单接口的appId是否一致

     注:get_band_wcpay_request:ok仅在用户成功完成支付时返回。由于前端交互复杂,get_band_wcpay_request:fail和get_band_wcpay_request:cancel可以统一处理为用户遇到错误或主动放弃,不细化分区。

    var getWCPage = function(){
        var url = get("api/invokeWXPage");
        var data={orderId}
        $.ax(url,data,null,null,getWXPage,function(e){
            layer.closeAll('loading');
            ordermsg('系统错误',function(){
                //系统错误处理方式
            })
        });
        function getWXPage(result){
            if(result==0){
                var json_obj = result.data;
                //将字符串转换为JSON格式
                var str = JSON.parse(json_obj);
                //公众号名称,由商户传入
                var appId = str.appId;
                //时间戳,自1970年以来的秒数
                var timeStamp = str.timeStamp;
                //随机串
                var nonceStr = str.nonceStr;
                var package = str.package;
                //微信签名方式
                var signType = str.signType;
                //微信签名
                var paySign = str.paySign;
                //封装请求数据
                request_data = {appId:appId,timeStamp:timeStamp,
                        nonceStr:nonceStr,package:package,signType:signType,paySign:paySign};
    
                if(typeof WeixinJSBbridge == 'undifine'){
                    if(document.addEventListener){
                        document.addEventListener('WeixinJSBridgeReady',onBridgeReady,false);
                    }else if(document.attachEvent){
                        document.attachEvent('WeixinJSBridgeReady',onBridgeReady);
                        document.attachEvent('OnWeixinJSBridgeReady',onBridgeReady);
                    }
                }
               
            }
            layer.closeAll('loading');
        }
    }
    function onBridgeReady(){
        WeixinJSBridge.invoke('getBandWCPayRequest',request_data,function(res){
            // 使用以上方式判断前端返回,微信团队郑重提示:
            //res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
            if(res.msg == 'get_band_wcpay_request:ok'){
                resultmsg('支付成功');
            }else{
                resultmsg('支付失败');
            }
        })
    }

    注:WeixinJSBridge内置对象在其他浏览器中无效。

    该文档参考于【微信支付】JSAPI支付开发者文档

    展开全文
  • 微信文章页标题、内容、发布时间、作者等信息。 采集示例URL https://mp.weixin.qq.com/s?src=11&timestamp=1523173327&ver=803&signature=6PCxJ*3ojH2ZM8pm56Lquward0mQMwSkPnqCvYlrDkQmL2kAE...
  • 作者:听雨堂 ...来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 我认为小程序的最大的价值在于:吹响了手机端应用从C/S向B/S迁移的号角。 从很多特点来看,小程序都非常类似于...
  • 从很多特点来看,小程序都非常类似于网页:主要的业务逻辑在服务端、客户端无需安装应用程序、小程序的开发采用的HTML+JS+CSS技术等等。张小龙自己对小程序的定位也大概如此:无意做小程序分发平台,只是做类似于PC...
  • 查看天气、寻找美食、微信购物、查询话费、信用卡还款……伴随着移动互联网终端的普及,微信公众平台已经***到人们生活的方方面面,其简单便捷的操作,在很大程度上满足了人们日常生活、工作的需求,极大改变了人们...
  • 【CSDN 编者按】早几天前,CSDN 曾发布了关于国产手机厂商们联合起来组织快应用标准的文章,今天,小米、中兴、华为、金立、联想、魅族、努比亚、OPPO、...这对于当前整个 Android 生态、开发者以及用户们究竟意味着什
  • 工作流程为从UI处得到原型图或者效果图,在项目(网站、微信公众号、小程序、WEBAPP)中还原图片效果,然后与后台进行各种数据交互。在项目中充当一号背锅侠,项目出现问题第一个收到传唤的人。一个不受UI、后台待见...
  • 小程序-开发入门

    千次阅读 2017-01-13 10:47:44
    各位好,2017年1月9号,随着小程序上线的序幕,一场由微信挑起的原生APP与小程序的线上撕逼正式拉开了序幕。一时间沸腾的网络文章诸如《原生APP已死》的文章成爆炸之势。作为一名Android的原生开发者,不免心头一紧...
  • 欢迎加我的微信进行技术交流,非技术的人生思考问题也可以进行探讨。我的微信号如下图 以下问题,随机排序,不分先后! Q、推荐算法工程师的工资待遇怎么样 A:这个问题真的是很直接呀,当然可以理解,毕竟我们...
  • 物联网开发技术栈

    万次阅读 多人点赞 2019-07-05 10:04:31
    内容简介 作为互联网技术的进化,物联网开发并非孤立的技术栈,而是向上承接了互联网,向下统领了嵌入式硬件开发的一个承上启下的全栈开发技术。 虽然我们并不能预测物联网技术栈最终的样子:统一的开发语言是 ...
  • 开发者最讨厌的编程语言竟然是...

    千次阅读 2017-11-14 12:23:09
    程序猿(微信号:imkuqin) 猿妹 编译 原文:... ...开发者最讨厌的编程语言:PHP、Objective-C、Ruby 纷纷躺枪 ...你知道最不受开发者待见的语言是什么吗?Stack Overflow 近日发布了一份数据,试图找
  • 在此期间,我们不断完善组件库的功能和特性,新增了许多组件和小工具,包括但不限于: 新增日历、索引选择、区域选择、图片选择等十一个组件 适配支付宝小程序、百度小程序 新增自定义主题功能 新增主题生成器,以...
  • 来自Unix/Linux的编程启示录

    千次阅读 多人点赞 2017-02-13 12:23:09
    写本文的最初灵感源于16年11月份我将工作环境切换到Mac OS上,其中一些使用"差异"让我开始对Unix/Linux中设计产生了浓厚的兴趣.虽然从13年开始使用redhat,再到后来一直使用的ubuntu,但却从来关注过这些,特此记录.
  • 5月16日是 OpenVINO™ 工具套件工具套件(下称“ OpenVINO ”)发布两周年的纪念日。在 OpenVINO 问世的这两年间,在其功能逐渐完善,使用愈发方便的同时, OpenVINO 社区在海外也逐渐发展起来了。开发者们聚在一起...
  • 身处其中的开发者又需要了解哪些内容? 本文无意挑起编程语言争端,而是希望以最新的趋势一窥当前各大主流语言的发展现状。 作者 | 屠敏 出品 | CSDN(ID:CSDNNews) 人工智能学习路线+实战训练 ht...
  • 我们最近的研究表明,富裕国家(世界银行定义为高收入国家)喜欢研究的技术与其他国家的不同。其中,我们看到最大的差异是Python语言。当我们关注高收入国家的时候,甚至可以看到Python的增长速度甚至比Stack ...
  • Python 代码调试二三事

    2019-04-30 16:40:38
    有任何疑问欢迎关注微信公众号:网易游戏运维平台。(长按识别上图二维码) 微信公众号原文链接:Python 代码调试二三事 Python 代码调试二三事 前言 借着机器学习的东风,Python近年来大热,一举冲入最受欢迎编程...
1 2 3 4 5
收藏数 86
精华内容 34
关键字:

微信开发者工具 调起支付