c#开发微信支付之企业向用户付款

潘小博1992 潘小博1992     2022-09-19     158

关键词:

1、企业付款的介绍

所谓企业付款指的是,在功能开放后诸如保险行业的客户理赔、退保、商品退款、发放征集活动奖金、抽奖互动等操作都可以通过企业付款完成。而此前,微信支付只能提供客户向企业单向付款。

商户如果需要给用户付款,可以直接将钱打入用户的“微信零钱”中,微信支付将做零钱入账消息通知,零钱收支明细会展示相应记录。针对无零钱账户的历史客户端版本,资金将进入用户的红包账户,微信支付无消息通知用户,企业可选择自行触达用户。

通过认证的企业号可以开通微信支付功能。通过认证的企业号可以管理平台的“服务中心”的“微信支付”入口里进行微信支付功能申请。而开通微信支付功能后,企业号将拥有两项功能:收款和付款。如果是用户号对企业号付款,款项将会进入企业号所关联的商户号中。同时,企业号可以通过微信红包或微信转账的形式对用户号付款。

企业付款,提供企业向用户付款的功能,支持企业通过API接口付款,或通过微信支付商户平台网页功能操作付款。

涉及资金操作的功能,安全性要求较高,需要操作员安装证书(商户平台-账户设置-密码安全-操作证书);通过API或网页操作,付款至目标用户(企业可根据APPID+OpenID锁定目标用户)。针对已实名认证的用户,微信支付可提供校验真实姓名一致性的可选功能。 

企业付款提示:

    ◆ 给同一个实名用户付款,单笔单日限额2W/2W

    ◆ 给同一个非实名用户付款,单笔单日限额2000/2000

    ◆ 一个商户同一日付款总额限额100W

    ◆仅支持商户号已绑定的APPID;

    ◆针对付款的目标用户,已微信支付实名认证的用户可提供校验真实姓名的功能,未实名认证的用户无法校验,企业可根据自身业务的安全级别选择验证类型;

    ◆付款金额必须小于或等于商户当前可用余额的金额;

    ◆ 已付款的记录,企业可通过企业付款查询查看相应数据。

技术分享

 

2、企业付款API

企业付款业务是基于微信支付商户平台的资金管理能力,为了协助商户方便地实现企业向个人付款,针对部分有开发能力的商户,提供通过API完成企业付款的功能。 
比如目前的保险行业向客户退保、给付、理赔。

企业付款将使用商户的可用余额,需确保可用余额充足。查看可用余额、充值、提现请登录商户平台“资金管理”进行操作。

接口地址

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

是否需要证书

请求需要双向证书。 详见证书使用

请求参数

技术分享

提交数据示例:

技术分享
<xml>
<mch_appid>wxe062425f740c30d8</mch_appid>
<mchid>10000098</mchid>
<nonce_str>3PG2J4ILTKCH16CQ2502SI8ZNMTM67VS</nonce_str>
<partner_trade_no>100000982014120919616</partner_trade_no>
<openid>ohO4Gt7wVPxIT1A9GjFaMYMiZY1s</openid>
<check_name>OPTION_CHECK</check_name>
<re_user_name>张三</re_user_name>
<amount>100</amount>
<desc>节日快乐!</desc>
<spbill_create_ip>10.2.3.10</spbill_create_ip>
<sign>C97BDBACF37622775366F38B629F45E3</sign>
</xml>
技术分享

成功返回的数据示例:

技术分享
<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[]]></return_msg>
<mch_appid><![CDATA[wxec38b8ff840bd989]]></mch_appid>
<mchid><![CDATA[10013274]]></mchid>
<device_info><![CDATA[]]></device_info>
<nonce_str><![CDATA[lxuDzMnRjpcXzxLx0q]]></nonce_str>
<result_code><![CDATA[SUCCESS]]></result_code>
<partner_trade_no><![CDATA[10013574201505191526582441]]></partner_trade_no>
<payment_no><![CDATA[1000018301201505190181489473]]></payment_no>
<payment_time><![CDATA[2015-05-19 15:26:59]]></payment_time>
</xml>
技术分享

根据上面的接口描述,以及输入,返回参数,我们可以构建对应的C#代码的接口

技术分享

根据上面的接口定义,我们可以定义接口信息如下所示

技术分享
    /// <summary>
    /// 微信支付接口
    /// </summary>
    public interface ITenPayApi
    {  

        /// <summary>
        /// 企业付款(请求需要双向证书)
        /// 企业付款业务是基于微信支付商户平台的资金管理能力,为了协助商户方便地实现企业向个人付款,
        /// 针对部分有开发能力的商户,提供通过API完成企业付款的功能。 比如目前的保险行业向客户退保、给付、理赔。
        /// 企业付款将使用商户的可用余额,需确保可用余额充足。查看可用余额、充值、提现请登录商户平台“资金管理”进行操作。https://pay.weixin.qq.com/ 
        /// 注意:与商户微信支付收款资金并非同一账户,需要单独充值。
        /// </summary>
        /// <param name="json">企业支付数据</param>
        /// <returns></returns>
        CorpPayResult CorpPay(CorpPayJson json);

        ..............
技术分享

其中上面的CorpPayJson 和CorpPayResult 分别是传入参数和获取的结果内容,两者的对象信息根据参数进行定义即可。

技术分享

技术分享
    /// <summary>
    /// 企业付款的数据信息
    /// </summary>
    public class CorpPayJson
    {
        public CorpPayJson()
        {
            this.check_name = "FORCE_CHECK";
        }

        /// <summary>
        /// 微信支付分配的终端设备号
        /// </summary>
        public string device_info { get; set; }

        /// <summary>
        /// 用户openid
        /// </summary>
        public string openid { get; set; }

        /// <summary>
        /// 校验用户姓名选项,可以使用 PayCheckName枚举对象获取名称
        /// NO_CHECK:不校验真实姓名 
        /// FORCE_CHECK:强校验真实姓名(未实名认证的用户会校验失败,无法转账) 
        /// OPTION_CHECK:针对已实名认证的用户才校验真实姓名(未实名认证用户不校验,可以转账成功)
        /// </summary>
        public string check_name { get; set; }

        /// <summary>
        /// 收款用户真实姓名。 
        /// 如果check_name设置为FORCE_CHECK或OPTION_CHECK,则必填用户真实姓名
        /// </summary>
        public string re_user_name { get; set; }

        /// <summary>
        /// 企业付款金额,单位为分
        /// </summary>
        public int amount { get; set; }

        /// <summary>
        /// 企业付款操作说明信息。必填。
        /// </summary>
        public string desc { get; set; }

        /// <summary>
        /// 调用接口的机器Ip地址
        /// </summary>
        public string spbill_create_ip { get; set; }
    }
技术分享
技术分享
    /// <summary>
    /// 企业付款操作的返回结果
    /// </summary>
    public class CorpPayResult : PayResult
    {    
        /// <summary>
        /// 微信分配的公众账号ID(企业号corpid即为此appId)
        /// </summary>
        public string mch_appid { get; set; }

        /// <summary>
        /// 微信支付分配的终端设备号
        /// </summary>
        public string device_info { get; set; }

        /// <summary>
        /// 商户使用查询API填写的单号的原路返回. 
        /// </summary>
        public string partner_trade_no { get; set; }

        /// <summary>
        /// 企业付款成功,返回的微信订单号
        /// </summary>
        public string payment_no { get; set; }

        /// <summary>
        /// 企业付款成功时间
        /// </summary>
        public string payment_time { get; set; }
    }
技术分享

企业付款的API实现和前面两种红包的处理方式 差不多,一个是传入常规的账号信息,一个是传入业务参数,然后提交获取结果即可,具体代码如下所示。

技术分享
        /// <summary>
        /// 企业付款(请求需要双向证书)
        /// 企业付款业务是基于微信支付商户平台的资金管理能力,为了协助商户方便地实现企业向个人付款,
        /// 针对部分有开发能力的商户,提供通过API完成企业付款的功能。 比如目前的保险行业向客户退保、给付、理赔。
        /// 企业付款将使用商户的可用余额,需确保可用余额充足。查看可用余额、充值、提现请登录商户平台“资金管理”进行操作。https://pay.weixin.qq.com/ 
        /// 注意:与商户微信支付收款资金并非同一账户,需要单独充值。
        /// </summary>
        /// <param name="json">企业支付数据</param>
        /// <returns></returns>
        public CorpPayResult CorpPay(CorpPayJson json)
        {
            CheckAccount();//检查AccountInfo的对象属性值

            WxPayData data = new WxPayData();
            data.SetValue("mch_appid", AccountInfo.UniteAppId);//公众账号appid, 注意是mch_appid,而非wxappid
            data.SetValue("mchid", AccountInfo.MchID);//商户号, 注意是mchid而非mch_id
            data.SetValue("nonce_str", data.GenerateNonceStr());//随机字符串
            data.SetValue("spbill_create_ip", NetworkUtil.GetIPAddress());//终端ip      
            data.SetValue("partner_trade_no", data.GenerateOutTradeNo(AccountInfo.MchID));//随机字符串

            data.SetValue("device_info", json.device_info);//终端ip            
            data.SetValue("openid", json.openid);
            data.SetValue("check_name", json.check_name);
            data.SetValue("re_user_name", json.re_user_name);
            data.SetValue("amount", json.amount);
            data.SetValue("desc", json.desc);

            data.SetValue("sign", data.MakeSign(AccountInfo.PayAPIKey));//最后生成签名

            var url = string.Format("https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers");
            return Helper.GetPayResultWithCert<CorpPayResult>(data, url, AccountInfo.CertPath, AccountInfo.CertPassword);
        }
技术分享

接口定义及实现好后,我们可以在项目中对API进行调用测试,具体代码如下所示

技术分享
CorpPayJson json = new CorpPayJson()
            {
                amount = 100,
                check_name = PayCheckName.FORCE_CHECK.ToString(),
                desc = "测试退款",
                openid = this.openId,
                device_info = "",
                re_user_name = "伍华聪",
                spbill_create_ip = NetworkUtil.GetIPAddress()
            };

            var result = api.CorpPay(json);
            var message = string.Format("企业直接付款:{0} {1}", result.Success ? "成功" : "失败", result.Message);
            Console.WriteLine(message);
            Console.WriteLine(result.ToJson());
技术分享

技术分享

付款操作成功后,我们可以看到这个钱是直接到用户钱包里面去的,而且我们也可以在商户后台进行记录的查看,可以看到对应的记录。

技术分享


微信支付之企业付款到零钱(代码片段)

1.项目搭建框架php3.12.项目代码<?phpclassPaymoneyActionextendsActionpublicfunctionindex()$appid="";//商户账号appid$secret="";//api密码$mch_id="";//商户号$mch_no="";//微信支付商户秘钥$openid="";//授权用户openid$arr=array();$arr[ 查看详情

《企业微信》对应付款方式的使用方法介绍

参考技术A企业微信的支付方式分为很多种,企业红包、向员工付款、向员工收款等。每个付款方式的使用方法都存在一定的差异。今天我为大家带来了企业微信付款方式的详细使用方法,希望能帮助到大家。企业可以在企业微... 查看详情

如何使用easywechat开发微信支付功能

直接接入微信支付,这是微信最为官方的,也是较为权威的支付模式,微信平台运营者可以通过微信官方开通微信支付,开通微信支付,首先你的账号需要是一个服务号,其次,你要申请并通过微信公众平台的认证,通过认证之... 查看详情

微信开发--企业付款到用户

在微信公众号支付的API中没有这个接口,如果企业需要给用户转账,或者让用户提现或者给用户发红包等需要再商户平台中的产品中心分别开通。 一、开通功能开通就是点击一下,很简单。但需要注意的是支持向用户转账的... 查看详情

企业如何开通微信支付付给个人

企业开通微信支付给个人,则需要开通“企业付款到零钱”功能,这是最常见的方法;微信服务号开通微信支付后,是可以实现企业付款到个人的方式有两种:现金红包:登录微信支付商户后,在营销中心下面有现金红包按钮,... 查看详情

使用easywechat快速开发微信支付

前期准备:申请微信支付后,会收到2个参数,商户id,和商户key.注意,这2个参数,不要和微信的参数混淆.微信参数:appid,appkey,token支付参数:merchant_id(商户号),key(支付密钥)支付密钥怎么得到?到https://pay.weixin.qq.com-->账户中心-->API安... 查看详情

浅析微信支付:(余额提现)企业付款到微信用户零钱或银行卡账户(代码片段)

本文是【浅析微信支付】系列文章的第十二篇,主要讲解在商户存在的提现、商户付款到微信用户零钱或者银行卡需求。浅析微信支付系列已经更新十二篇了哟~,没有看过的朋友们可以看一下哦。浅析微信支付:支付验收示例... 查看详情

开发微信小程序的具体流程都有哪些?

...之前必须要完成和注册认证。如果是个人或者小公司想开发微信小程序,也可以找微信认证第三方开发商,比如赢在移动、正品科技等。1、微信小程序注册在微信公众平台官网首页,按照提示点击右上角的“立即注册”按钮,... 查看详情

如何使用easywechat开发微信支付功能

这类专业的技术问题,建议您可以下载一下开发者文档该文档在您申请了微信商家之后就可以下载的然后根据文档里面的技术规范进行调整和开发参考技术A信支付功能 查看详情

使用nodejs开发微信公众号

  准备工作1.首先注册自己的微信公众号。微信公众号现在分为订阅号,服务号,企业号,服务号和企业号不对个人开发者开放,所以我们只能选择订阅号。但是订阅号也有认证和未认证之分,认证的订阅号支持的接口更多也... 查看详情

wex5开发基础之微信支付

一、企业开通微信支付条件      微信支付是集成在微信客户端的支付功能,用户可以通过手机完成快速的支付流程。微信支付以绑定银行卡的快捷支付为基础,向用户提供安全、快捷、高效的支付服务。 ... 查看详情

微信商户平台开通企业付款功能怎么开通

...到零钱?支持企业通过API接口付款,详见图片,通过微信支付商户平台网页功能操作付款。地址:登录【商户平台】,进入【交易中心】-【企业付款到零钱】2、新商户号没有看到企业付款到零钱选项怎么办?有读者反应新申请... 查看详情

微信可以用于企业付款到个人吗

可以的;1、拥有微信支付商户号。如果没有,可通过微信公众平台或微信开放平台申请。2、企业微信需要认证。可通过公众平台授权认证或全新认证绑定商户号登录【企业微信管理端】->【企业应用】->【企业支付】,申请... 查看详情

微信支付方法企业该如何开通微信支付

...认证通过的公众号后台登录,打开添加功能插件添加微信支付模块,在信公众平台——服务——服务中心,点击“商户功能”按照要求填写内容提交资料。 参考技术B准备1、拥有微信支付商户号。如果没有,可通过微信公众平台... 查看详情

使用c#开发微信公众号对接chatgpt和dall-e(代码片段)

...xin——微信.NETSDK:使用Senparc.Weixin,您可以方便快速地开发微信全平台的应用(包括微信公众号、小程序、小游戏、企业号、开放平台、微信支付、JS-SDK、微信硬件/蓝牙,等等。新建一个空的.netcoreWebAPI项目并引入Nuget包如下:I... 查看详情

(十四)springboot开发微信授权支付

前提:配置好域名,在公众号配置一.引用jar包,在pom.xml文件加入依赖<dependency><groupId>com.github.binarywang</groupId><artifactId>weixin-java-mp</artifactId><version>2.7.0</version></ 查看详情

玩转小程序支付之付款(统一下单)

小程序的业务流程如下商户系统和微信支付系统主要交互说明:步骤1:用户在商户APP中选择商品,提交订单,选择微信支付。步骤2:商户后台收到用户支付单,调用微信支付统一下单接口。参见【统一下单API】。步骤3:统一下... 查看详情

微信公众号开启企业付款到用户

将网址https://pay.weixin.qq.com/index.php/extend/product/lists?tid=3改为  https://pay.weixin.qq.com/index.php/public/product/detail?pid=5就能访问微信公众号隐藏功能之企业付款到用户功能啦! 查看详情