企业付款到零钱API开发~~~ 付款到微信

近日,在开发“微信企业付款到零钱”的功能。之前有过微信开发的经验,但是第一次接触“付款到零钱“这一块的业务,查询了很多的博客资料以及走了很多的弯路。也发现“企业付款到零钱”分享的博客并不多。特地写了该博客,希望对你们有帮助。个人浅薄的见解
资料下载:没积分找我拿~ ~这边分享资料一定要设个积分值,没办法
http://download.csdn.net/download/xiaozhegaa/10226929
这里写图片描述
【稍微提一下:】上一篇博客分享了“企业付款到银行卡API~~”文章,有位博友留言了,遇到了“产品权限验证失败 请查看您当前是否具有该产品的权限”。这是因为没有在微信商务后台开通对应的功能。API里面已经明确提示了。这里我是建议:大家一定要先去看文档,看完再来看这篇文章。文档也就三四页而已,也就20分钟
这里写图片描述
一、企业付款到零钱API
https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_1
【建议还是看看】
这里写图片描述
二、开发准备
(1)证书的准备:java开发需要用到:apiclient_cert.p12证书的,在微信商户平台(pay.weixin.qq.com)–>账户设置–>API安全–>证书中下载的 。
这里写图片描述

【何时用到证书?】与支付不一样,企业支付功能在发送post请求的时候,需要加载自己的一个证书之后,带着证书去请求退款才可以。这里使用到证书–很多人不知道证书在哪里使用
(2)了解好数字签名 — 简单来解释,就是对自己要发送的数据进行加密处理、换句话说假如说你要传递A/B/C,就对这三者进行加密。初开发者的误区:不知道该加密什么数据、观看网上的博客胡乱进行签名,导致签名错误
【温馨提示:】数字签名是一般开发人员容易遇到的错误,记住“你没遇到数字签名错误,都不好意思说自己做过微信退款支付订单查询等功能”。 签名工具类见:我这里就不贴出来了
http://blog.csdn.net/xiaozhegaa/article/details/79127283

耐心解决就行
(3) xml到map、map到xml转化、发送Post请求、签名等操作。具体见下篇文章。方法和类都分享出来了,copy即可
http://blog.csdn.net/xiaozhegaa/article/details/79127283

三、API截图解释
~~ 开通条件:
这里写图片描述
~ 接口说明 + 是否需要证书
这里写图片描述

~ 证书说明 java开发只需要:apiclient_cert.p12
这里写图片描述

四、开发步骤如下
这里写图片描述

1、拼凑所需要传递的参数 map集合
2、根据要传递的参数生成自己的签名
3、把签名放到map集合中【因为签名也要传递过去,看API】
4、将当前的map结合转化成xml格式
5、发送请求到企业付款到零钱的Api。发送请求是一个方法来的POST
6、解析返回的xml数据===》map集合

7、根据map中的result_code AND return_code来判断是否成功与失败

不得不再啰嗦一下。下面设计到签名、mapToXml转化、xmlToMap转化、发送请求到API。这些方法都可以在下面网址看到。这里我Xml转化成Map。我是习惯用一个Bean接收,也有范例的代码,大家模仿能力要强一点。这次贴出来给大家看看吧
http://blog.csdn.net/xiaozhegaa/article/details/79127283

@SuppressWarnings("unchecked") 
    public static EnterpriceToCustomer parseXmlToMapEnterpriceToCustomer(String xml){ 
            EnterpriceToCustomer enterpriceToCustomer = new EnterpriceToCustomer(); 
            try { 
                    StringReader read = new StringReader(xml); 
                    // 创建新的输入源SAX 解析器将使用 InputSource 对象来确定如何读取 XML 输入 
                    InputSource source = new InputSource(read); 
                    // 创建一个新的SAXBuilder 
                    SAXBuilder sb = new SAXBuilder(); 
                    // 通过输入源构造一个Document 
                    Document doc; 
                    doc = (Document) sb.build(source); 

                    Element root = doc.getRootElement();// 指向根节点 
                    List<Element> list = root.getChildren(); 

                    if(list!=null&&list.size()>0){ 
                    for (Element element : list) { 
                        System.out.println("key是:"+element.getName()+",值是:"+element.getText()); 
                        if("return_code".equals(element.getName())){ 
                                enterpriceToCustomer.setReturn_code(element.getText()); 
                            } 

                        if("return_msg".equals(element.getName())){ 
                                enterpriceToCustomer.setReturn_msg(element.getText()); 
                            } 

                        if("mchid".equals(element.getName())){ 
                            enterpriceToCustomer.setMchid(element.getText()); 
                        }

                        if("nonce_str".equals(element.getName())){ 
                            enterpriceToCustomer.setNonce_str(element.getText()); 
                        }
                        if("result_code".equals(element.getName())){ 
                            enterpriceToCustomer.setResult_code(element.getText()); 
                        }
                        if("partner_trade_no".equals(element.getName())){ 
                            enterpriceToCustomer.setPartner_trade_no(element.getText()); 
                        }
                        if("payment_no".equals(element.getName())){ 
                            enterpriceToCustomer.setPayment_no(element.getText()); 
                        }
                        if("payment_time".equals(element.getName())){ 
                            enterpriceToCustomer.setPayment_time(element.getText()); 
                        }   
                        //错误的编码
                        /*
                           private String err_code;
                           private String err_code_des;
                         * */
                        if("err_code".equals(element.getName())){ 
                            enterpriceToCustomer.setErr_code(element.getText()); 
                        }
                        if("err_code_des".equals(element.getName())){ 
                            enterpriceToCustomer.setErr_code_des(element.getText()); 
                        }   

                    }
                }


            } catch (JDOMException e) { 
            e.printStackTrace(); 
            } catch (IOException e) { 
            e.printStackTrace(); 
            }catch (Exception e) { 
            e.printStackTrace(); 
            } 

            return enterpriceToCustomer; 
        } 
@Test
    public void OldBook(){
        //1.0 拼凑企业支付需要的参数
        String appid = wxconfig.AppID;  //微信公众号的appid
        String mch_id = wxconfig.mch_id; //商户号
        String nonce_str = RandomStringGenerator.getRandomStringByLength(32); //生成随机数
        String partner_trade_no =  RandomStringGenerator.getRandomStringByLength(32); //生成商户订单号
        String openid = "oYiAh0ypHoaYFoVFhAsnv1aJ****"; // 支付给用户openid
        String check_name = "NO_CHECK"; //是否验证真实姓名呢
        String re_user_name = "小郑";   //收款用户姓名
        String amount = "100";              //企业付款金额,单位为分
        String desc = "测试开发,稍后会还给公司的";   //企业付款操作说明信息。必填。
        String spbill_create_ip = "192.168.**.****;     //

        //2.0 生成map集合
        SortedMap<Object, Object> packageParams = new TreeMap<Object, Object>(); 
        packageParams.put("mch_appid", appid);         //微信公众号的appid
        packageParams.put("mchid", mch_id);       //商务号
        packageParams.put("nonce_str",nonce_str);  //随机生成后数字,保证安全性

        packageParams.put("partner_trade_no",partner_trade_no); //生成商户订单号
        packageParams.put("openid",openid);            // 支付给用户openid
        packageParams.put("check_name",check_name);    //是否验证真实姓名呢
        packageParams.put("re_user_name",re_user_name);//收款用户姓名
        packageParams.put("amount",amount);            //企业付款金额,单位为分
        packageParams.put("desc",desc);                //企业付款操作说明信息。必填。
        packageParams.put("spbill_create_ip",spbill_create_ip); //调用接口的机器Ip地址


        //3.0 生成自己的签名
        String sign  = WeixinPayBack.createSign("utf-8",packageParams);

        //4.0 封装退款对象
        packageParams.put("sign", sign);

        //5.0将当前的map结合转化成xml格式
        String reuqestXml = WXPayUtil.getRequestXml(packageParams);

        //6.0获取需要发送的url地址
        String wxUrl = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers"; //获取退款的api接口

        try {
            String weixinPost = ClientCustomSSL.doRefund(wxUrl, reuqestXml).toString();
            //7.0 解析返回的xml数据
            com.fh.entity.nrb.xiaozheng.EnterpriceToCustomer refundResult = WeixinPayBack.parseXmlToMapEnterpriceToCustomer(weixinPost);
            if("SUCCESS".equalsIgnoreCase(refundResult.getResult_code()) && "SUCCESS".equalsIgnoreCase(refundResult.getReturn_code())){
                //8表示退款成功
                //TODO 执行成功付款后的业务逻辑
                //return successPayMoneyByBankCard(submitMoney,cmms_amt,enterpriceToCustomerByCard,applyId,companyId);
            }else{
                //9 表示退款失败
                //TODO 调用service的方法 ,存储失败提现的记录咯
                //failToPayMoneyByBankCard(enterpriceToCustomerByCard,applyId);


            }

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


    }

这里写图片描述

五、结果演示
这里写图片描述
自此,我们就学会了“企业付款到个人零钱”的开发,希望对你们有帮助
具体的、在调用改方法自己加上自己的业务逻辑就行了。希望对大家有帮助

猜你喜欢

转载自blog.csdn.net/xiaozhegaa/article/details/79178751
今日推荐