微信商户支付

  先吐槽下微信,完全就是个坑,文档确实有,但是个别细节没有提,有些得自己试。

  下面总结下微信商户支付的开发,用处一般是用户从商户提现。

  首先,要获取提现用户的openId,openId是用户对于公众号的唯一标识,openId是用户在公众 号中的唯一标识,一个openId只属于一个公众号。openId在用户关注公众号之类的活动中可以得到。

  接下来按照微信的文档,准备需要提交的参数:

  

        Map<String, Object> paras = new HashMap<>();
        paras.put("mch_appid" , "*******");
    ......    

  然后是根据参数生成签名:

  生成前要对参数根据参数名的ascii码顺序排序:

  

        List<Map.Entry<String, Object>> list = new ArrayList<>(paras.entrySet());
        Collections.sort(list, new Comparator<Map.Entry<String, Object>>() {
            public int compare(Map.Entry<String, Object> kv1, Map.Entry<String, Object> kv2) {
                return kv1.getKey().compareTo(kv2.getKey());
            }
        });    

  生成签名:

    private String getSign(List<Map.Entry<String, Object>> list) {
        StringBuffer para = new StringBuffer();

        if (!list.isEmpty()) {
            for (Map.Entry<String, Object> one : list) {
                String value = String.valueOf(one.getValue());
                if (isNotEmpty(value)){
                    para.append("&")
                            .append(one.getKey())
                            .append("=")
                            .append(one.getValue());
                }
            }
            para.deleteCharAt(0);
            para.append("&key=" + WXConstants.SECRET_KEY);
        }

        return Md5Util.encodeUpper(para.toString());
    }

  注意:所有参数后需要加入秘钥,并且key一定要放在最后,秘钥在商户后台的API安全中设置

  然后要以同样的顺序生成xml格式的参数,这个参数里要加入签名sign,key是不需要加进来的。

  

    private String getWXPara(List<Map.Entry<String, Object>> list){
        StringBuffer para = new StringBuffer();
        para.append("<xml>");

        for (Map.Entry<String, Object> one : list){
            para.append(String.format("<%s>", one.getKey()))
                    .append(String.format("<![CDATA[%s]]>", one.getValue()))
                    .append(String.format("</%s>", one.getKey()));
        }

        para.append("</xml>");
        return para.toString();
    }

  有了参数就可以通过微信提供的接口提交数据了,提交时是需要证书的,证书在商户平台API安全中下载。

  带着证书发送:

        public String post(String para, String pathCA, String key) throws CertificateException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyStoreException, KeyManagementException, IOException {
        log.info("wx.post, {} : request {} & para : {}\n", this.name, this.url, para);
        StringEntity entity = new StringEntity(para, EscapeUtil.CHARSET_UTF8);
        HttpPost post = new HttpPost(url);
        post.setEntity(entity);

        CloseableHttpClient client = getSSLClient(pathCA, key);
        CloseableHttpResponse response = client.execute(post);

        int httpCode = response.getStatusLine().getStatusCode();
        byte[] bs = EntityUtils.toByteArray(response.getEntity());
        String result = new String(bs, EscapeUtil.CHARSET_UTF8);
        if (httpCode != 200){
            log.warn("wx.post.httpCodeErr, {} : return {} & httpCode : {} & content : {} & para : {}\n", this.name, httpCode, result, this.url, para);
        }
        log.info("wx.post, {} : return {} & para : {}\n", this.name, result, para);
        return content;
    }
    private CloseableHttpClient getSSLClient(final String pathCA, final String key) throws KeyStoreException, IOException, CertificateException, NoSuchAlgorithmException, UnrecoverableKeyException, KeyManagementException {
        KeyStore keyStore  = KeyStore.getInstance(WXConstants.CERT_TYPE);
        FileInputStream instream = new FileInputStream(new File(pathCA));try {
            keyStore.load(is, key.toCharArray());
        } finally {
            is.close();
        }

        // Trust own CA and all self-signed certs
        SSLContext sslcontext = SSLContexts.custom()
                .loadKeyMaterial(keyStore, key.toCharArray())
                .build();
        // Allow TLSv1 protocol only
        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
                sslcontext,
                new String[] { WXConstants.SSL_PROTOCOL },
                null,
                SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
        CloseableHttpClient httpclient = HttpClients.custom()
                .setSSLSocketFactory(sslsf)
                .build();
        return httpclient;
    }

  如果人品还过得去,一般就可以了,不过还有一个小坑,微信文档上说返回成功的时候返回值中会有sign,不过实际上其实是没有的。。。

时间: 2024-10-10 09:53:00

微信商户支付的相关文章

ecshop微信支付(0923更新)商户支付密钥key的生成与设置

ECSHOP 微信支付(0923更新)商户支付密钥key的生成与设置 说明:新版微信支付,用户必须授权登录才能支付.需要商家自己设置商户号支付密钥. 申请微信支付手机版部分时需要填写的配置接口地址: 1.在微信公众平台设置好支付授权目录. http(s)://域名/mobile/ 支付请求实例:http(s)://域名/mobile/weixin/open-api.php 2.维权通知URL:http(s)://域名/mobile/weixin/wxpay_activists_recall.ph

微信支付(20140923更新)商户支付密钥key的生成与设置

微信支付(0923更新)商户支付密钥key的生成与设置 说明:新版微信支付,用户必须授权登录才能支付.需要商家自己设置商户号支付密钥. 设置商户号支付密钥方法如下: 1. 申请通过审核后,打开微信发来的邮件. 直接获取微信支付商户号(接口文档中的商户号MCHID):(也叫 受理商ID 填写到后台). 商户支付密钥key 按以下步骤自己设置生成. 2 点击访问 新商户平台http://mch.weixin.qq.com 或https://pay.weixin.qq.com,用账号和密码登录.并安装

[教程] 微信支付如何设置商户支付密钥(密钥Key)

新版的微信支付改动比较大,新增了一个API密钥,好多用户都不知道是啥,也不知道如何设置,现在我来和大家说一下具体的操作步骤:1.登录微信商户号后,找到账户设置 -> 密码安全 -> API安全 -> API密钥:<IGNORE_JS_OP> 2,设置密钥Key,设置好之后,复制到网站后台即可. 3,进你后台 -> 功能选项 -> 支付参数 -> 设置微信支付 -> 选择新版接口类型      会看到新增一项商户支付密钥(密钥Key/api):复制填写刚

小程序开通微信支付 --- 微信商户平台绑定微信小程序APPID

首先情况是这样的:现有公司有个公众号,已经开通了微信支付(已经有一个商户平台),现在需要开发 微信小程序(也有微信支付),如果在小程序里面重新申请 微信支付,就显得比较麻烦.腾讯官方已经提供了 一个商户平台可以绑定10个 appid .公众号也是如此. 首先进入小程序的后台:点击 微信支付 : 它会弹出让你选择 新申请 还是 绑定已有的微信支付账号.选择 "绑定" 安装里面的操作流程 去微信商户平台进行绑定即可: 按照上面的步骤在商户平台绑定完成之后,还需要回到小程序里面进行 M -

微信h5支付demo微信H5支付demo非微信浏览器支付demo微信wap支付

一.首先先确定H5支付权限已经申请!(需要微信h5支付demo的可以加 851 488 243 备注:h5支付) 二.开发流程 1.用户在商户侧完成下单,使用微信支付进行支付 2.由商户后台向微信支付发起下单请求(调用统一下单接口)注:交易类型trade_type=MWEB 3.统一下单接口返回支付相关参数给商户后台,如支付跳转url(参数名"mweb_url"),商户通过mweb_url调起微信支付中间页 4.中间页进行H5权限的校验,安全性检查(此处常见错误请见下文) 5.如支付成

微信扫描支付订单数据生成类[模式二]

* *必要条件: *1.微信公共号 *2.微信公共号APPID *3.微信公共号 [微信支付] 绑定的 商户号MCH_ID *4. 微信公共号 商户支付密钥 * * 支付流程: * 1.调用统一下单,取得code_url,生成二维码 * 2.用户扫描二维码,进行支付 * 3.支付完成之后,微信服务器会通知支付成功 * 4.在支付成功通知中需要查单确认是否真正支付成功 业务流程说明: (1)商户后台系统根据用户选购的商品生成订单. (2)用户确认支付后调用微信支付[统一下单API]生成预支付交易:

微信app支付 ci框架做的

/**     * 组合微信app支付  获得prepayid     * @param int $order_num     */    private function _wxpay_request($order_num = 0)    {                //判断订单编号必须是数组并且不为0        check_order_num($order_num); //引入微信支付类            libraries_include("wxpay/", &qu

微信原生支付 Native扫码支付( V3.3.7 版本)

[尊重别人的劳动成果,转载请注明出处:一缕晨光工作室,www.wispdawn.com] 前言 辛苦研究三天,遇到各种困难,最终还是克服了,把我的理解和思路分享给需要帮助的人,如果你觉的好,请帮我分享一下,谢谢. 在没有做之前,我以为和支付宝,以及银联一样,会在官网找到相应的demo,照葫芦画瓢即可,没有什么复杂的,真正去做的时候,发现各种错误,很多时候都莫名其妙找不到北, 在网上搜了不知道多少遍,有V3版的,不过都是js api版本的,没有找到原生扫码支付,下了几个V2版本的微信支付c#dem

微信app支付android客户端以及.net服务端实现

由于公司运营需要,需要在客户端(android/ios)增加微信以及支付宝支付,在调用微信app支付时遇到一些问题,也算是一些踩过的坑,记录下来 ,希望能对.net开发者服务端网站更快的集成微信app支付. 1.开发所需资料:微信开放平台应用的appid以及appsecert,商户平台的商户号以及api安全里面里面设置的key,详见 微信支付账户相关信息; 2.微信开发者平台完善应用平台的相关信息,android应用签名必须用打包签名过的发布版本apk(这一步很重用),包名必须一致,可以用微信提