精华内容
下载资源
问答
  • 微信企业支付到零钱

    2018-07-23 19:04:17
    为广大开发者提供一个微信企业支付到零钱,如果有更好的我们可以一起交流一下
  • 微信企业支付到零钱,把遇到的坑分享出来供各位小伙伴参考
  • 最近由于开发需要,进行了微信支付--企业支付到零钱的功能开发,期间也参考了部分网上的开发思路,以及微信支付的开发问题,在这里做一下总结和源码分享。 腾讯的开发文档:...

          最近由于开发需要,进行了微信支付--企业支付到零钱的功能开发,期间也参考了部分网上的开发思路,以及微信支付的开发问题,在这里做一下总结和源码分享。

         腾讯的开发文档:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_1

        主要逻辑代码是这样的:

    public class WxPayUtil {
    
        private static final Logger logger = LoggerFactory.getLogger(WxPayUtil.class);
    
        // 接口链接
        private static final String URL = WxPayDO.getUrl();
    
        private static final String appid = WxPayDO.getAppID();
    
        // 微信支付分配的商户号
        private static final String mchid = WxPayDO.getMch_id();
    
        public static Map<String, Object> wxPay(String openid, Integer amount,String userName) throws Exception {
    
            Map<String, Object> map = new HashMap<String, Object>();
    //        logger.info("开始微信提现操作");
            //主机ip地址
            String IP = InetAddress.getLocalHost().getHostAddress();
            // 随机获取随机字符串
            String nonce_str = RandCharsUtil.getRandomString(16);
            //商户订单号
            String partner_trade_no = "partner_trade_no"+System.currentTimeMillis();
            //真实姓名
            String re_user_name = userName;
    
            // 企业付款描述信息
            String desc = "你的描述";
            if (!openid.equals("") || !openid.equals(null)) {
    
                // 设置支付参数
                SortedMap<Object, Object> signParams = new TreeMap<Object, Object>();
                signParams.put("mch_appid", appid); // 微信分配的公众账号ID
                signParams.put("mchid", mchid);// 微信支付分配的商户号
                signParams.put("nonce_str", nonce_str); // 随机字符串,不长于32位
                signParams.put("partner_trade_no", partner_trade_no); // 商户订单号,需保持唯一性
                signParams.put("openid", openid); // 商户appid下,某用户的openid
                signParams.put("check_name", "FORCE_CHECK"); // 校验真实姓名,也可以选择不做真实姓名校验
                signParams.put("re_user_name",re_user_name);
                signParams.put("amount", amount); // 企业付款金额,单位为分
                signParams.put("desc", desc); // 企业付款操作说明信息。必填。
                signParams.put("spbill_create_ip", IP); // 调用接口的机器Ip地址
    
                // 生成支付签名,要采用URLENCODER的原始值进行MD5算法!
                String sign = WXSignUtil.createSign("UTF-8", signParams);
    //            logger.info("签名:"+sign);
                String data = "<xml><mch_appid>";
                data += appid + "</mch_appid><mchid>"; // APPID
                data += mchid + "</mchid><nonce_str>"; // 商户ID
                data += nonce_str + "</nonce_str><partner_trade_no>"; // 随机字符串
                data += partner_trade_no + "</partner_trade_no><openid>"; // 订单号
                data += openid + "</openid><check_name>FORCE_CHECK</check_name><re_user_name>"; // 是否强制实名验证
                data += re_user_name + "</re_user_name><amount>"; //用户真实姓名
                data += amount + "</amount><desc>"; // 企业付款金额,单位为分
                data += desc + "</desc><spbill_create_ip>"; // 企业付款操作说明信息。必填。
                data += IP + "</spbill_create_ip><sign>";// 调用接口的机器Ip地址
                data += sign + "</sign></xml>";// 签名
    
    //            logger.info("xml数据:"+data);
                // 获取证书,发送POST请求;
                KeyStore keyStore = KeyStore.getInstance("PKCS12");
                // 从配置文件里读取证书的路径信息
                FileInputStream instream = new FileInputStream(
                        new File(WxPayDO.getClient().replaceAll("\\\\", "/")));
    
                keyStore.load(instream, mchid.toCharArray());// 证书密码是商户ID
                instream.close();
                SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, mchid.toCharArray()).build();
                SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext,
                        new String[] { "TLSv1" }, null,
                        SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
                CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
                HttpPost httpost = new HttpPost(URL); //
                httpost.addHeader("Connection", "keep-alive");
                httpost.addHeader("Accept", "*/*");
                httpost.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
                httpost.addHeader("Host", "api.mch.weixin.qq.com");
                httpost.addHeader("X-Requested-With", "XMLHttpRequest");
                httpost.addHeader("Cache-Control", "max-age=0");
                httpost.addHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0) ");
                httpost.setEntity(new StringEntity(data, "UTF-8"));
                CloseableHttpResponse response = httpclient.execute(httpost);
                HttpEntity entity = response.getEntity();
    
                String jsonStr = EntityUtils.toString(response.getEntity(), "UTF-8");
                logger.info("提现返回的数据为:" + jsonStr);
                EntityUtils.consume(entity);
                // 把返回的字符串解释成DOM节点
                Document dom = DocumentHelper.parseText(jsonStr);
                Element root = dom.getRootElement();
                String returnCode = root.element("result_code").getText(); // 获取返回代码
    
    //            logger.info("返回状态码:"+returnCode);
                if (StringUtils.equals(returnCode, "SUCCESS")) { // 判断返回码为成功还是失败
                    String payment_no = root.element("payment_no").getText(); // 获取支付流水号
                    String payment_time = root.element("payment_time").getText(); // 获取支付时间
                    //返回信息
                    map.put("state", true);
                    map.put("time", String.valueOf(System.currentTimeMillis()));
                    logger.info(payment_no +"  支付成功  "+payment_time);
                    return map;
                } else {
                    String err_code = root.element("err_code").getText(); // 获取错误代码
                    String err_code_des = root.element("err_code_des").getText();// 获取错误描述
                    logger.info(err_code+"   支付失败  "+err_code_des);
                    //返回错误信息
                    map.put("state", false);
        //                        map.put("Message", utils);
                    map.put("time", String.valueOf(System.currentTimeMillis()));
                    return map;
                }
            } else {
                logger.info("没有获得openid");
                map.put("state", false);
                map.put("message", "抱歉没有获得openid");
                map.put("time", String.valueOf(System.currentTimeMillis()));
                return map;
            }
        }
    }

    代码有需要调用的类:

    public class WXSignUtil {
    
        private static final Logger logger = LoggerFactory.getLogger(WXSignUtil.class);
    
        private static final String key = WxPayDO.getKey();
    
        public static String createSign(String characterEncoding,SortedMap<Object,Object> parameters){
            StringBuffer sb = new StringBuffer();
            //所有参与传参的参数按照accsii排序(升序)
            Set es = parameters.entrySet();
            Iterator it = es.iterator();
            while(it.hasNext()) {
                Map.Entry entry = (Map.Entry)it.next();
                String k = (String)entry.getKey();
                Object object = entry.getValue();
                if(null != object && !"".equals(object) && !"sign".equals(k) && !"key".equals(k)) {
                    sb.append(k + "=" + object + "&");
                }
            }
            sb.append("key=").append(key);
            String sign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase();
            logger.info("sign >>>> "+sign);
            return sign;
        }
    }
    public class WxPayDO implements Serializable {
    
        // 商户API密钥
        public static String key = "商户API密钥";
    
        private static String appID="appid";
    
        private static String mch_id="mch_id";
    
        //1.本地测试 (这里写了3个client 根据你本身的环境来定 这里配置的是你的证书路径 )
        //private static String client =  "\\apiclient_cert.p12";
    
        //2.这是window环境上的测试路径
    //    private static String client =  "F:\\client\\apiclient_cert.p12";
    
        //3.这是linux环境下测试的路径
        private static String client =  "\\opt\\client\\apiclient_cert.p12";
    
        private static String url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers";
    
        public static String getKey() {
            return key;
        }
    
        public static void setKey(String key) {
            WxPayDO.key = key;
        }
    
        public static String getAppID() {
            return appID;
        }
    
        public static void setAppID(String appID) {
            WxPayDO.appID = appID;
        }
    
        public static String getMch_id() {
            return mch_id;
        }
    
        public static void setMch_id(String mch_id) {
            WxPayDO.mch_id = mch_id;
        }
    
        public static String getClient() {
            return client;
        }
    
        public static void setClient(String client) {
            WxPayDO.client = client;
        }
    
        public static String getUrl() {
            return url;
        }
    
        public static void setUrl(String url) {
            WxPayDO.url = url;
        }
    }

     

    展开全文
  • nodejs实现微信企业支付到零钱

    千次阅读 2018-08-23 22:48:04
    微信企业支付到零钱 提前说一个重要的坑,请大家注意不要绕进去浪费时间。 用户付款到商户平台的账户 与 商户付款到个人的账户是相互独立的 意思是商户要付款到个人必须用自己充值到商户平台账户的钱 企业付款到...

    微信企业支付到零钱

    提前说一个重要的坑,请大家注意不要绕进去浪费时间。

    1. 用户付款到商户平台的账户 与 商户付款到个人的账户是相互独立的 意思是商户要付款到个人必须用自己充值到商户平台账户的钱
    2. 企业付款到个人必须开通此功能 之后才可以使用
    3. 需要到商户平台下载支付证书 在使用时不要用官方的demo太久远了而且压根不能用,在引用时直接把文件存放在服务器上的绝对路径写到函数里(相对于服务器的绝对路径)
    4. 在算签名的时候注意 ASCII的顺序  大写字母 < _ < 小写字母 (实在是太坑了)
    5. 支付金额必须大于100 单位分
    6. 直接上代码 wxcompay.js

    /**

    * Created by feng on 2018/08/17

    */

    /*拼接微信企业付款字符串 */

     

    var config = require('../../config');

    var request = require('request');

    var xml2js = require('xml2js');

    var fs = require('fs');

    var https = require('https');

    var fnCreateXml = function(json){

    var _xml = '';

    for(var key in json) {

    _xml+= '<'+key+'>'+json[key]+'</'+key+'>';

    }

    return _xml;

    }

    /*

    生成url串用于微信md5校验

    */

    var fnCreateUrlParam = function(json){

    var _str = '';

    var _arr = []

    for(var key in json){

    _arr.push(key+'='+json[key]);

    }

    return _arr.join('&');

    }

    /*

    生成微信红包数据

    */

    var fnGetWeixinBonus = function(option){

    var amount = option.amount || 100, //红包总金额

    openid = option.openid || 'opVfe0pFBNN65Dn-PE_SEEjr0MHY';//红包发送的目标用户

    var now = new Date();

    var showName = config.server.showName;

    var clientIp = config.server.clientIp;

    var desc = config.server.wishing;

    var mch_id = config.server.mch_id;

    var mch_appid = config.server.appid,

    wxkey = config.server.wxkey;

    var date_time = now.getFullYear()+''+(now.getMonth()+1)+''+now.getDate();

    var date_no = (now.getTime() +'').substr(-8); //生成8为日期数据,精确到毫秒

    var random_no = Math.floor(Math.random()*99);

    if(random_no < 10){ //生成位数为2的随机码

    random_no = '0'+ random_no;

    }

    var nonce_str = Math.random().toString(36).substr(2, 15);

    var partner_trade_no = mch_id + date_time+ date_no + random_no;

    var xmlTemplate = '<xml>{content}</xml>';

    var contentJson = {};

    contentJson.amount = amount;// '100';

    contentJson.check_name = "NO_CHECK";// '强制验证名字';FORCE_CHECK

    contentJson.desc = desc;//'恭喜发财';

    contentJson.mch_appid = mch_appid;//商户appid

    contentJson.mchid = mch_id;

    contentJson.nonce_str = nonce_str;

    contentJson.openid = openid;// 'opVfe0v30XbCW7LE2j-7ruENJFS0'; //三月风的openid // 'onqOjjmM1tad-3ROpncN-yUfa6uI';

    contentJson.partner_trade_no = partner_trade_no; //订单号为 mch_id + yyyymmdd+10位一天内不能重复的数字; //+201502041234567893';

    // contentJson.re_user_name = showName;

    contentJson.spbill_create_ip = clientIp;

    contentJson.key = wxkey;

    var contentStr = fnCreateUrlParam(contentJson);

    console.log('content='+ contentStr);

    var crypto = require('crypto');

    contentJson.sign = crypto.createHash('md5').update(contentStr, 'utf8').digest('hex').toUpperCase();

    // //生成sign

    // contentJson.sign = paysign(mch_appid, mch_id, nonce_str, partner_trade_no, openid, clientIp, "NO_CHECK",amount,desc);

    //删除 key (key不参与签名)

    delete contentJson.key;

    var xmlData = fnCreateXml(contentJson);

    var sendData = '<xml>'+ xmlData +'</xml>'; //_xmlTemplate.replace(/{content}/)

    return sendData;

    console.log('xml='+ sendData);

    }

     

    function paysign(mch_appid, mch_id, nonce_str, partner_trade_no, openid, clientIp,amount,desc) {

    var ret = {

    mch_appid: mch_appid,

    mchid: mch_id,

    nonce_str: nonce_str,

    partner_trade_no: partner_trade_no,

    openid: openid,

    spbill_create_ip: clientIp,

    check_name: "NO_CHECK",

    amount: amount,

    desc: desc

    };

    var string = raw(ret);

    var key = config.server.wxkey; //微信商户密钥

    string = string + '&key=' + key; //key为在微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置

    var crypto = require('crypto');

    var sign = crypto.createHash('md5').update(string, 'utf8').digest('hex');

    return sign.toUpperCase();

    };

     

    function raw(args) {

    var keys = Object.keys(args);

    keys = keys.sort()

    var newArgs = {};

    keys.forEach(function (key) {

    newArgs[key.toLowerCase()] = args[key];

    });

    var string = '';

    for (var k in newArgs) {

    string += '&' + k + '=' + newArgs[k];

    }

    string = string.substr(1);

    console.log(string);

    return string;

    };

     

    //微信企业支付到零钱

    exports.wxcompay = function(req,res,callback){

    // https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers

    var host = 'api.mch.weixin.qq.com';

    var path = '/mmpaymkttransfers/promotion/transfers';

    var amount = req.body.amount;

    var openid = req.body.openid;

    var opt = {

    host: host,

    port:'443',

    method:'POST',

    path: path,

    key: fs.readFileSync('./config/apiclient_key.pem'), //将微信生成的证书放入 cert目录下

    cert: fs.readFileSync('./config/apiclient_cert.pem')

    }

    var body = '';

    opt.agent = new https.Agent(opt);

    var req = https.request(opt, function(res) {

    console.log("Got response: " + res.statusCode);

    res.on('data',function(d){

    body += d;

    }).on('end', function(){

    //console.log(res.headers);

    console.log('微信返回消息');

    console.log(body);

    var parser = new xml2js.Parser({ trim:true, explicitArray:false, explicitRoot:false });//解析签名结果xml转json

    parser.parseString(body, function(err, result){

    if(typeof callback == 'function'){

    callback(result['return_code']+'|'+ result['return_msg']+'|'+ result['result_code']);

    }

    });

    });

    }).on('error', function(e) {

    console.log("Got error: " + e.message);

    });

    var option = {amount,openid};

    var sendData = fnGetWeixinBonus(option);

    req.write(sendData);

    req.end();

    }

    2.config.js 系统参数配置文件

    'use strict';

    module.exports = {

    clientIp:"126.77.66.132",

    showName:"天天科技",

    wishing:"恭喜发财",

    mch_id:"1511515151",

    wxkey:"tiantiankeji8888", //key为在微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置

    appid:"wxefcc9999999999",//微信支付app的appid

    wxappid:"wx3a66666666666",//微信公众号appid

    appsecret: "wx8888888888888"//公众号secret

    };

     

    3.app.js里调用方法:

    //微信企业支付js引用

    let wxcompay = require('./modules/wxcompay');

    //微信企业支付

    app.post('/wxcompay',wxcompay.wxcompay);

     

     

    注意事项:

    1. 签名是不是一直变动的呢?是的 每一个签名都是不一样的,别想着存起来一直用!怎么算呢?官方有一个文档,对于会的人来说就是废话,对于不会的来说就是天书。总的来说分为3部,官方有一个签名生成工具https://pay.weixin.qq.com/wiki/tools/signverify/
       
      1. 将你本次请求的所有参数(当然除了签名),按照一定的顺序排序成一个字符串,顺序一会再说,先说格式,比如本次的这次请求有9个参数:

        $str = "amount=100&check_name=NO_CHECK&desc=退款成功&mch_appid=wx8888888888888888&mchid=1900000109&nonce_str=5K8264ILTKCH16CQ2502SI8ZNMTM67VS&openid=oxTWIuGaIt6gTKsQRLau2M0yL16E&partner_trade_no=10000098201411111234567890&spbill_create_ip=192.168.0.1";

        仔细观察不难发现,字符串排列是有顺序的 为键值首字母的排列顺序。而官方为了听起来霸气,讲的是根据 参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式排序吓的我一哆嗦啊! 不就字母顺序表么!不过仔细一看发现不对了,比如 mchid和 mch_appid这尼玛前三个字母一样啊,一位一位排序下来出现一个 i 和 _怎么办呢? 这时候就用到ASCII码表了,不过看官也不用去查了 上面的可以直接粘去用了 而ASCII码表的顺序呢就是按照0123456789:;< = > ? @ ABCDEFGHIJKLMNOPQRSTUVWXYZ [ \ ] ^ _ ` abcdefghijklmnopqrstuvwxyz { | }~的顺序排列 那么我门就知道mch_appid应该在 mchid 前面了。
      2. 排序完这9个参数 之后再用&加上特殊参数 微信支付平台上设置的支付密钥就是$str = "amount=100&check_name=NO_CHECK&desc=提现成功&mch_appid=wx8888888888&mchid=1900000109&nonce_str=5K8264ILTKCH16CQ2502SI8ZNMTM67VS&openid=oxTWIuGaIt6gTKsQRLau2M0yL16E&partner_trade_no=10000098201411111234567890&spbill_create_ip=192.168.0.1&key=F5YguNW77Ao4N5yu5wZ8Lb00NKO987ks"
      3. 之后就简单了先md5加密下然后转为大写 签名就OK了
    展开全文
  • //企业支付到零钱 namespace app\wechat\controller; use think\Controller; use think\facade\Request; class Wxpay extends Controller { private $params; public function initialize() { //模拟原始...

    Wxpay.php

    <?php
    
    //企业支付到零钱
    
    namespace app\wechat\controller;
    
    use think\Controller;
    use think\facade\Request;
    
    class Wxpay extends Controller {
    
        private $params;
    
        public function initialize() {
            //模拟原始数据
            $this->params = [
                'amount' => '1', //金额 单位分
                'check_name' => 'NO_CHECK', //校验用户姓名选项 NO_CHECK:不校验真实姓名 FORCE_CHECK:强校验真实姓名
                'desc' => 'tx', //付款描述
                'mch_appid' => config('wechat.appid'), //APPid,
                'mchid' => config('wechat.mchid'), //商户号,
                'nonce_str' => md5(time()), //随机字符串
                'openid' => getOpenId(), //用户openid
                'partner_trade_no' => date('YmdHis'), //商户订单号
                'spbill_create_ip' => Request::ip(), //调用接口机器的ip地址 
            ];
        }
    
        public function index() {
            $res = $this->sign();
            $dat = ArrToXml($res);
            $xml = iconv('UTF-8', 'ISO8859-1', $dat);
            $url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers';
            $returnXml = postData($url, $xml);
            $returnArr = XmlToArr($returnXml);
            dump($returnArr);
        }
    
        public function sign() {
            return $this->setSign($this->params);
        }
    
        /**
         * 获取签名 
         * @param array $arr
         * @return string
         */
        public function getSign($arr) {
            //去除空值
            $arrfilter = array_filter($arr);
            if (isset($arrfilter['sign'])) {
                unset($arrfilter['sign']);
            }
            //按照键名字典排序
            ksort($arrfilter);
            //生成url格式的字符串
            $str = $this->arrToUrl($arr) . '&key=' . config('wechat.key');
            // echo $str;die;
            return strtoupper(md5($str));
        }
    
        /**
         * 获取带签名的数组 
         * @param array $arr
         * @return array
         */
        public function setSign($arr) {
            $arr['sign'] = $this->getSign($arr);
            return $arr;
        }
    
        /**
         * 数组转URL格式的字符串
         * @param array $arr
         * @return string
         */
        public function arrToUrl($arr) {
            return urldecode(http_build_query($arr));
        }
    
    }

    公共方法:common.php

    //数组转xml
    function ArrToXml($arr) {
        if (!is_array($arr) || count($arr) == 0) {
            return '';
        }
        $xml = "<xml>";
        foreach ($arr as $key => $val) {
            $xml .= "<" . $key . ">" . $val . "</" . $key . ">";
        }
        $xml .= "</xml>";
        return $xml;
    }
    
    //Xml转数组
    function XmlToArr($xml) {
        if ($xml == '') {
            return '';
        }
        libxml_disable_entity_loader(true);
        $arr = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
        return $arr;
    }
    
    //CURL携带ssl证书和秘钥
    function postData($url, $postfields) {
    
        $ch = curl_init();
        $params[CURLOPT_URL] = $url;    //请求url地址
        $params[CURLOPT_HEADER] = false; //是否返回响应头信息
        $params[CURLOPT_RETURNTRANSFER] = true; //是否将结果返回
        $params[CURLOPT_FOLLOWLOCATION] = true; //是否重定向
        $params[CURLOPT_POST] = true;
        $params[CURLOPT_POSTFIELDS] = $postfields;
        $params[CURLOPT_SSL_VERIFYPEER] = false;
        $params[CURLOPT_SSL_VERIFYHOST] = false;
        //以下是证书相关代码
        $params[CURLOPT_SSLCERTTYPE] = 'PEM';
        $params[CURLOPT_SSLCERT] = 'apiclient_cert.pem';  
        $params[CURLOPT_SSLKEYTYPE] = 'PEM';
        $params[CURLOPT_SSLKEY] = 'apiclient_key.pem';  
    
        curl_setopt_array($ch, $params); //传入curl参数
        $content = curl_exec($ch); //执行
        curl_close($ch); //关闭连接
        return $content;
    }
    
    //获取用户OpenId
    function getOpenId() {
        $openid = Cache::get('openid');
        if ($openid) {
            return $openid;
        } else {
            //1.用户访问一个地址 先获取到code
            if (Request::get('code') == null) {
                //构建回调地址为当前地址
                $redurl = Request::server('REQUEST_SCHEME') . '://' . Request::server('HTTP_HOST') . Request::server('REQUEST_URI');
                $reurl = urlEncode($redurl);
                $url = 'https://open.weixin.qq.com/connect/oauth2/authorize?' . "appid=" . config('wechat.appid') . "&redirect_uri=" . $reurl . "&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect";
                //响应跳转请求
                header("location:{$url}");
                exit;
            } else {
                //2.根据code获取到openid
                //调用接口获取openid
                $openidurl = 'https://api.weixin.qq.com/sns/oauth2/access_token?' . "appid=" . config('wechat.appid') . "&secret=" . config('wechat.secret') . "&code=" . Request::get('code') . "&grant_type=authorization_code";
                $data = curl_request($openidurl);
                $arr = json_decode($data, true);
                Cache::set('openid', $arr['openid']);
                return $arr['openid'];
            }
        }
    }

    配置文件:wechat.php

    <?php
    
    return [
        'key' => '',
        'mchid' => '',
        'appid' => '',
        'secret' => '',
    ];

    微信公众平台支付接口调试工具

    展开全文
  • 微信支付、企业支付、微信企业支付到个人,微信企业付款到零钱, 代码DEMO 供大家参考 微信支付apiJSAPI支付 刷卡支付 扫码支付 订单退款 订单查询 退款查询 下载账单
  • 说到微信支付企业付款到零钱,很多人都骂腾讯SB。现在企业付款到零钱开通条件是商户号必须注册满90天,连续交易30天,但你以为满足条件了就能开通?天真了!满足了条件还不给开通,很有腾讯的味道,简直不给人活路啊...

    44ff1f1ebf69245189f5f356ba49fcad.png

    说到微信支付企业付款到零钱,很多人都骂腾讯SB。

    b45a1c43c0f49bdb50a2b902e02641ec.png


    现在企业付款到零钱开通条件是商户号必须注册满90天,连续交易30天,但你以为满足条件了就能开通?天真了!

    7177596c987427ac70fab01033016130.png


    满足了条件还不给开通,很有腾讯的味道,简直不给人活路啊,难道真就没办法开通了么?
    今这篇文章就和你系统聊聊这个问题,把微信支付企业的来龙去脉摸清楚,然后找到偏门的方法快速开通。上干货!1、什么是企业付款到零钱?
    企业付款到零钱功能提供由商户付款至用户微信零钱的能力,支持平台操作及接口调用两种方式。特点
    免费:不收取付款手续费,节省企业成本。
    快速:在发起后,及时到账用户零钱。通过微信消息触达,用户及时获知入账详情。
    灵活:可通过页面或接口发起付款,灵活满足企业不同场景的付款需求。
    友好:通过openid即可实现付款,无需获取用户敏感隐私信息。
    安全:提供多种安全工具,满足不同场景安全需求。如:按需调整付款额度;支持收款账户限制;支持安全防刷,拦截恶意用户、小号、机器号码;支持自定义大额通知等。应用场景
    费用报销、员工福利、保险理赔、用户奖励等。额度限制
    商户号单日付款上限:默认10w,根据经营情况最高可提高至100w。同一用户单日收款上限:默认5k,根据经营情况最高可提高至2w单笔付款上限:默认5k,根据经营情况最高可提高至2w单笔付款下限:最低0.3元,不支持申请更低额度2、如何操作企业付款到零钱?
    一、企业付款操作1、支持企业通过API接口付款,详见 、通过微信支付商户平台网页功能操作付款。地址:登录【商户平台】,进入【交易中心】-【企业付款到零钱】

    87976ae9b0233d409c847bdf4e502082.png

    3、新商户号没有看到企业付款到零钱选项怎么办?
    有读者反应新申请的商户号,连企业付款到零钱这个选项都没有,更别提申请了,这时该怎么办呢?
    1、登录微信支付商户平台
    2、如果没有“企业付款到零钱”产品,进入产品大全页面,将网址原网址.com后方更改为,直接访问地址 参见下图:

    efacdf7c252d13fbc0760fb84351fc87.png

    4、如何快速开通企业付款到零钱?
    企业付款到零钱有办法快速开通,下面为大家提供二种方法,都可以去尝试。

    方法一:
    这个方法非常偏门,看概率,运气好的话当天就能开通。
    一天多次不同时间段点击申请开通,正常都会提示不满足条件,运气好的话能通过。目前知道这个bug的人不多。2018年年末时企业付款到零钱已经是必须满足90天注册,连续交易30天限制,我第一天试了5次都没开通,第二天很再试时莫名其妙的开通。后面再碰运气试了几次,都没有开通。所以搞不懂腾讯的。既然有成功案例,没事就多试试呗。

    方法二:
    找已经开通企业付款到零钱的微信支付服务商,他们帮你开的商户号带企业付款到零钱功能的概率会大些。
    商户号分为普通商户商户号和特约商户商户号,自己申请的微信支付商户号就是普通商户,通过微信支付服务商开通的商户号为特约商户。服务商能帮特约商户开通企业付款到零钱,现金红包功能,降低支付费率等。最快的隔天商户号下来就带企业付款到零钱功能。

    72e06ea6b8901464e2d2c49f7bf5af0d.png
    展开全文
  • c#微信支付、微信企业支付到个人,微信企业付款到零钱, 代码DEMO.rar.rar c#微信支付、微信企业支付到个人,微信企业付款到零钱, 代码DEMO.rar.rar c#微信支付、微信企业支付到个人,微信企业付款到零钱, 代码...
  • PHP实现微信商户支付企业付款到零钱功能来源:中文源码网浏览: 次日期:2019年11月5日【下载文档:PHP实现微信商户支付企业付款到零钱功能.txt】(友情提示:右键点上行txt文档名->目标另存为)PHP实现微信商户支付...
  • 首先,科普一下什么是企业付款到零钱企业付款到零钱顾名思义就是企业商户号里面的资金直接付款到用户个人零钱里。这个是商家做营销活动的必要工具。营销活动返现,配送员提现,分销返佣等都需要用到。但是很多朋友...
  • java微信支付到零钱demo,即小例子,只要设置自己的相关参数即可完成支付,方便省时省事,嵌入自己的项目即可,大大提高开发效率。
  • 微信支付企业付款到零钱

    千次阅读 2018-06-30 18:27:31
    在微信支付企业付款到零钱的时候网上找了一下微信支付到商户的很多,但是微信支付企业付款到用户(提现~应该可以叫提现吧)却很少,于是想写写。 1、首先微信支付企业付款文档地址 2、这第一步就是获取微信用户的...
  • /***********************企业支付到个人零钱***************************/ /** * 企业支付到个人零钱 * @param string $openid 用户openID * @param string $trade_no 单号 * @param string $money 金额 *...
  • 本文为大家分享了PHP实现微信商户支付企业付款到零钱的具体代码,供大家参考,具体内容如下 微信支付开发文档 一、开通条件 企业付款为企业提供付款至用户零钱的能力,支持通过API接口付款,或通过微信支付商户平台...
  • 1.功能介绍简介 企业付款提供由商户直接付钱至用户微信零钱的能力,支持平台操作及接口调用两种方式。具有免费、快速到账、灵活、安全等优点。商户可以使用企业付款,用于如:费用报销、员工福利、用户奖励等。特点...
  • 今天两个小程序,一个可以正常体现到零钱,一个小程序不支持,配置和代码都一样,为什么不可以,结果一查找是因为,没有入住够90天,且必须30天有正常交易。才可以正常使用企业付款到零钱。 ...
  • 微信支付企业付款,提供企业向用户付款的功能,支持企业通过API接口付款,或通过微信支付商户平台网页功能操作付款
  • PHP微信商户支付企业付款到零钱功能,这个是一个php的类文件,就一个文件。 调用方式: $paymentchange = new wechat_paymentchange(); $res = $paymentchange->sendMoney($amount,$re_openid,$desc='测试',$check_...
  • 微信支付、微信企业支付到个人,微信企业付款到零钱,微信支付apiJSAPI支付 刷卡支付 扫码支付 订单退款 订单查询 退款查询 下载账单
  • 1、首先下载微信支付官方sdk ... * 企业付款到零钱接口调用结果类 * */ class WxTransfersResults extends WxPayResults{ /** * 将xml转为array * @param WxPayConfigInterface $config * @param string $x...
  • 很多朋友都说,为什么我想要开通企业付款到零钱这个功能怎么这么困难,今天小编就结合自己的一些经验向大家分享一下。 企业付款到零钱:顾名思义就是企业4商9户1号2里9面1的6资7金2直接付款到用户个人零钱里。...

空空如也

空空如也

1 2 3 4 5 ... 12
收藏数 232
精华内容 92
关键字:

企业支付到零钱