服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

香港云服务器
服务器之家 - 编程语言 - C# - 微信开发--企业转账到用户

微信开发--企业转账到用户

2021-12-20 14:48stoneniqiu C#

本文主要介绍了微信开发--企业转账到用户的实现方法与步骤。具有很好的参考价值,下面跟着小编一起来看下吧

在微信公众号支付的api中没有这个接口,如果企业需要给用户转账,或者让用户提现或者给用户发红包等需要再商户平台中的产品中心分别开通。

一、开通功能

微信开发--企业转账到用户

开通就是点击一下,很简单。但需要注意的是支持向用户转账的账户和收到用户付款的账户不是同一个,而为了满足此功能,你需要先用财付通进行充值(交易中心--资金管理--充值)。

二、下载证书

证书下载在账户中心--api安全,现在需要手机验证码和商户平台登录密码。下载之后再window上进行安装,安装的密码是商户号。

微信开发--企业转账到用户

安装之后并将证书放在网站目录下,用于下一步在代码中进行验证。

三、转账

微信现在提供的demo中没有这一块,下面就根据官方的demo做一些修改。和之前的例子类似,我们都需要用wxpaydata对象来操作我们的参数。定义一个transferspay对象。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class transferspay
 {
  public string openid { get; set; }
  public int amount { get; set; }
  public string partner_trade_no { get; set; }
  public string re_user_name { get; set; }
  public string spbill_create_ip { get; set; }
  public wxpaydata gettransfersapiparameters()
  {
   wxpaydata apiparam = new wxpaydata();
   apiparam.setvalue("partner_trade_no", partner_trade_no);
   apiparam.setvalue("openid", openid);
   apiparam.setvalue("check_name", "no_check");
   apiparam.setvalue("amount", amount);
   apiparam.setvalue("desc", "提现");
   apiparam.setvalue("spbill_create_ip", spbill_create_ip);
   apiparam.setvalue("re_user_name", re_user_name);
   return apiparam;
  }
 }

在官方demo中的wxpayapi中已经包含了公众号支付的相关方法。再增加一个transfers的方法用来转账:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static wxpaydata transfers(wxpaydata inputdata, int timeout = 6)
  {
   var url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers";
   inputdata.setvalue("mch_appid", wxpayconfig.appid);//公众账号id
   inputdata.setvalue("mchid", wxpayconfig.mchid);//商户号
   inputdata.setvalue("nonce_str", wxpayapi.generatenoncestr());//随机字符串
   inputdata.setvalue("sign", inputdata.makesign());//签名
   string xml = inputdata.toxml();
   var start = datetime.now;
   string response = httpservice.post(xml, url, true, timeout);
   // portal.mvc.logger.info("wxpayapi"+ "unfiedorder response : " + response);
   var end = datetime.now;
   int timecost = (int)((end - start).totalmilliseconds);
   wxpaydata result = new wxpaydata();
   result.fromxml(response);
   reportcosttime(url, timecost, result);//测速上报
   return result;
  }

稍微需要注意下的地方就是几个默认参数的名字和别的方法不一样,比如appid和mch_id。转账中是mch_appid和mchid,红包中又叫wxappid和mch_id。然后注意到httpservice.post方法第三个参数是带true的。也就是会使用到证书。进入post方法中我们可以看到:

?
1
2
3
4
5
6
7
8
//是否使用证书
    if (isusecert)
    {
     string path = httpcontext.current.request.physicalapplicationpath;
     x509certificate2 cert = new x509certificate2(path + wxpayconfig.sslcert_path, wxpayconfig.sslcert_password);
     request.clientcertificates.add(cert);
     log.debug("wxpayapi", "postxml used cert");
    }

这里使用到了证书的路径和密码,密码即商户号。这一切准备好之后就可以controller中进行转账了:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[loginvalid]
  public actionresult cashtransfers(string ordernumber)
  {
   //var order = new order(){amount = 1};
   // var openid = "obsbmwqjqwjfzqlksfnjxflsixxx";
   var user = _workcontext.currentuser;
   var order = _paymentservice.getorderbyordernumber(ordernumber);
   var transfer = new transferspay
   {
    openid = user.openid,
    amount = (int) order.amount*100,
    partner_trade_no = order.ordernumber,
    re_user_name = "stoneniqiu",
    spbill_create_ip = _webhelper.getcurrentipaddress()
   };
   var data = transfer.gettransfersapiparameters();
   var result = wxpayapi.transfers(data);
   return content(result.toprintstr());
  }

得到结果

微信开发--企业转账到用户

这样就实现了转账/提现的功能。

发布

在正式的环境中,我们需要先创建自己的订单,然后向微信请求转账,成功之后对自己的订单进行处理。cashtransfers方法稍作调整。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[loginvalid]
  public actionresult cashtransfers(string ordernumber)
  {
   var user = _workcontext.currentuser;
   var order = _paymentservice.getorderbyordernumber(ordernumber);
   if (string.isnullorempty(user.openid))
   {
    return json(new portalresult("请用微信登录!"));
   }
   if (order == null || order.orderstate != orderstate.padding)
   {
    return json(new portalresult("订单有误!"));
   }
   var transfer = new transferspay
   {
    openid = user.openid,
    amount = (int) order.amount*100,
    partner_trade_no = order.ordernumber,
    re_user_name = "stoneniqiu",
    spbill_create_ip = _webhelper.getcurrentipaddress()
   };
   var data = transfer.gettransfersapiparameters();
   var result = wxpayapi.transfers(data);
   if (result.getvalue("result_code").tostring() == "success")
   {
    return json(new portalresult(true, "提现成功"));
   }
   return json(new portalresult(false, result.getvalue("return_msg").tostring()));  
  }

另外一个要注意的是,发布之后老是出现操作超时的错误,建议就是修改超时时间为30秒。默认的6秒容易超时。支付的时候也是。

public static wxpaydata transfers(wxpaydata inputdata, int timeout = 30)

如果企业账户的钱没了,会出现以下提示:

微信开发--企业转账到用户

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

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持服务器之家!

原文链接:http://www.cnblogs.com/stoneniqiu/p/6337525.html

延伸 · 阅读

精彩推荐
  • C#深入解析C#中的交错数组与隐式类型的数组

    深入解析C#中的交错数组与隐式类型的数组

    这篇文章主要介绍了深入解析C#中的交错数组与隐式类型的数组,隐式类型的数组通常与匿名类型以及对象初始值设定项和集合初始值设定项一起使用,需要的...

    C#教程网6172021-11-09
  • C#WPF 自定义雷达图开发实例教程

    WPF 自定义雷达图开发实例教程

    这篇文章主要介绍了WPF 自定义雷达图开发实例教程,本文介绍的非常详细,具有参考借鉴价值,需要的朋友可以参考下...

    WinterFish13112021-12-06
  • C#C#设计模式之Visitor访问者模式解决长隆欢乐世界问题实例

    C#设计模式之Visitor访问者模式解决长隆欢乐世界问题实例

    这篇文章主要介绍了C#设计模式之Visitor访问者模式解决长隆欢乐世界问题,简单描述了访问者模式的定义并结合具体实例形式分析了C#使用访问者模式解决长...

    GhostRider9502022-01-21
  • C#C# 实现对PPT文档加密、解密及重置密码的操作方法

    C# 实现对PPT文档加密、解密及重置密码的操作方法

    这篇文章主要介绍了C# 实现对PPT文档加密、解密及重置密码的操作方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下...

    E-iceblue5012022-02-12
  • C#C#通过KD树进行距离最近点的查找

    C#通过KD树进行距离最近点的查找

    这篇文章主要为大家详细介绍了C#通过KD树进行距离最近点的查找,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    帆帆帆6112022-01-22
  • C#Unity3D实现虚拟按钮控制人物移动效果

    Unity3D实现虚拟按钮控制人物移动效果

    这篇文章主要为大家详细介绍了Unity3D实现虚拟按钮控制人物移动效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一...

    shenqingyu060520232410972022-03-11
  • C#C#实现XML文件读取

    C#实现XML文件读取

    这篇文章主要为大家详细介绍了C#实现XML文件读取的相关代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    Just_for_Myself6702022-02-22
  • C#C#裁剪,缩放,清晰度,水印处理操作示例

    C#裁剪,缩放,清晰度,水印处理操作示例

    这篇文章主要为大家详细介绍了C#裁剪,缩放,清晰度,水印处理操作示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    吴 剑8332021-12-08
1086