C# 微支付退款申请接口 V3.3.6
/// <summary>
/// 微支付退款申请
/// </summary>
/// <param name="context"></param>
/// <param name="returnMsg"></param>
/// <returns></returns>
public bool Refund(HttpContext context, ref string returnMsg)
{
int UID = 0;
string WXO_Remark = "";//退款说明
if (string.IsNullOrEmpty(context.Session["UID"] as string))
{
returnMsg = "请登录!";
return false;
}
UID = Convert.ToInt32(context.Session["UID"]); //当前用户
int Oid = Convert.ToInt32(context.Request["OID"].Trim()); //订单ID
model = modelBll.GetModel(Oid); //订单实体
Decimal refund;
if (context.Request["Refund"].Length > 0)
{
bool state = Decimal.TryParse(context.Request["Refund"].Trim(), out refund);
if(!state)
{
returnMsg = "请输入正确的退款金额!";
return false;
}
}
else
{
returnMsg = "请输入退款金额!";
return false;
}
if(refund > model.WXO_PRealPrice)
{
returnMsg = "输入错误,退款金额不得大于总金额!";
return false;
}
string Nonce = CreateRandomCode(15).ToLower(); //生成15个随机字符
string sign1 = "appid=" + CommonApi.AppID.ToString()+ //微信公众号的APPID
"&mch_id=" + CommonApi.MechID.ToString() + //商户号
"&nonce_str=" + Nonce + //随机字符串
"&op_user_id=" + CommonApi.MechID.ToString() + //用户(默认商户号)
"&out_refund_no=" + model.WXO_ORefundCode + //商户退款单号
"&out_trade_no=" + model.WXO_OCode + //商户单号
"&refund_fee=" + Convert.ToInt32(( refund*100 )) + //退款金额
"&total_fee=" + Convert.ToInt32((model.WXO_PRealPrice * 100)); //订单总金额
string sign2 = sign1 + "&key="+ CommonApi.PayKey.ToString(); //商户的Key
string sign = T9.Util.EncryptUtil.md5(sign2, 32).ToUpper(); //MD5加密
string URL = "https://api.mch.weixin.qq.com/secapi/pay/refund";
string RequstContext = "<xml>" +
"<appid><![CDATA["+CommonApi.AppID.ToString()+"]]></appid>" +
"<mch_id><![CDATA["+CommonApi.MechID.ToString()+"]]></mch_id>" +
"<nonce_str><![CDATA["+Nonce+"]]></nonce_str>" +
"<sign><![CDATA["+sign+"]]></sign>" +
"<out_trade_no><![CDATA["+model.WXO_OCode+"]]></out_trade_no>" +
"<out_refund_no><![CDATA["+model.WXO_ORefundCode+"]]></out_refund_no>" +
"<total_fee>"+ Convert.ToInt32((model.WXO_PRealPrice * 100 )) +"</total_fee>" +
"<refund_fee>"+ Convert.ToInt32((refund * 100 )) +"</refund_fee>" +
"<op_user_id><![CDATA["+CommonApi.MechID.ToString()+"]]></op_user_id>" +
"</xml>";
string WXRefund = SendInfoWithCa(URL, RequstContext); //调用发送方法
XmlDocument doc = new XmlDocument();
doc.LoadXml(WXRefund);
XmlElement rootElement = doc.DocumentElement;
string Code = rootElement.SelectSingleNode("return_code").InnerText; //协议级判断
if (Code == "SUCCESS") //协议级验证
{
string result_code = rootElement.SelectSingleNode("result_code").InnerText;
if (result_code == "SUCCESS")//业务级验证
{
return true;
}
else
{
returnMsg = "出现未知的错误,请联系管理员!";
return false;
}
}
else
{
returnMsg = "出现未知的错误,请联系管理员!";
return false;
}
}
/// <summary>
/// 生成随机字符串
/// </summary>
/// <param name="codeCount"></param>
/// <param name="allChar"></param>
/// <returns></returns>
public static string CreateRandomCode(int codeCount)
{
//验证码中的出现的字符,避免了一些容易混淆的字符。
string allChar = "3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,J,K,M,N,P,Q,R,S,T,U,W,X,Y";
string[] allCharArray = allChar.Split(',');
string randomCode = "";
int temp = -1;
bool breCreate = (codeCount < 6 && allCharArray.Length > 15);
Random rand = new Random();
for (int i = 0; i < codeCount; i++)
{
if (temp != -1)
{
rand = new Random(i * temp * ((int)DateTime.Now.Ticks));
}
int t = rand.Next(allCharArray.Length);
if (temp == t && breCreate)
{
return CreateRandomCode(codeCount);
}
temp = t;
randomCode += allCharArray[t];
}
return randomCode;
}
#region 向微信服务器发送信息通过证书认证
/// <summary>
/// 向微信服务器发送信息通过证书认证
/// </summary>
/// <param name="posturl">请求路径</param>
/// <param name="postData">请求参数</param>
/// <returns>返回信息</returns>
public string SendInfoWithCa(string posturl, string postData)
{
Stream outstream = null;
Stream instream = null;
StreamReader sr = null;
HttpWebResponse response = null;
HttpWebRequest request = null;
Encoding encoding = Encoding.UTF8;
byte[] data = encoding.GetBytes(postData);
// 准备请求...
try
{
string cert = @"D:\***\**\apiclient_cert.p12"; //证书路径(此证书必须安装)
string password = "***"; //证书密码
ServicePointManager.ServerCertificateValidationCallback=new RemoteCertificateValidationCallback(CheckValidationResult);
X509Certificate cer = new X509Certificate(cert, password);
// 设置参数
request = WebRequest.Create(posturl) as HttpWebRequest;
request.ClientCertificates.Add(cer);
CookieContainer cookieContainer = new CookieContainer();
request.CookieContainer = cookieContainer;
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data.Length;
outstream = request.GetRequestStream();
outstream.Write(data, 0, data.Length);
outstream.Close();
//发送请求并获取相应回应数据
request.KeepAlive = false;
response = request.GetResponse() as HttpWebResponse;
//直到request.GetResponse()程序才开始向目标网页发送Post请求
instream = response.GetResponseStream();
sr = new StreamReader(instream, encoding);
//返回结果网页(html)代码
string content = sr.ReadToEnd();
string err = string.Empty;
return content;
}
catch (Exception ex)
{
T9.Util.LogUtil.WriteLog(ex.Message + "\r\n" + ex.StackTrace, "WebLog");
return string.Empty;
}
}
#region CheckValidationResult的定义
/// <summary>
/// CheckValidationResult的定义
/// </summary>
/// <param name="sender"></param>
/// <param name="certificate"></param>
/// <param name="chain"></param>
/// <param name="errors"></param>
/// <returns></returns>
private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
{
if (errors == SslPolicyErrors.None)
{
return true;
}
return false;
}
C# 微支付退款申请接口 V3.3.6的更多相关文章
- C# 微支付退款查询接口 V3.3.6
#region 微支付退款查询 string Nonce = CreateRandomCode(15).ToLower(); //生成15个随机字符string sign1 = "appid ...
- java使用AES-256-ECB(PKCS7Padding)解密——微信支付退款通知接口指定解密方式
1.场景 在做微信支付退款通知接口时,微信对通知的内容做了加密,并且指定用 AES256 解密,官方指定的解密方式如下: 2.导包 <!-- https://mvnrepository.com/ ...
- Core3.1 微信v3 JSAPI支付 退款
1.前言 上一篇写了<Core3.1 微信v3 JSAPI支付>,这个属于v3的接口规则,现在研究了下退款的接口我写的时候它属于v2接口规则文档.但凡微信支付文档里面写清楚点我也不会在这里 ...
- C# 微支付 JSAPI支付方式 V3.3.6版本
<script type="text/javascript">//结算 (订单号) function PayClearing(num) { $.ajax({ type: ...
- 微支付开发(.net)
最近一周多进行微支付开发工作,总结一下关于微支付开发中遇到的问题. 如写得不对请大家提出,第一次自己写文章.嘿嘿... 1.申请微支付,登陆公众平台后(公众号为服务号并已认证),进入“服务”-“服务中 ...
- 微信支付退款(PHP后端)
应用场景 当交易发生之后一段时间内,由于买家或者卖家的原因需要退款时,卖家可以通过退款接口将支付款退还给买家,微信支付将在收到退款请求并且验证成功之后,按照退款规则将支付款按原路退到买家帐号上. 微信 ...
- 第四百零三节,python网站在线支付,支付宝接口集成与远程调试,
第四百零三节,python网站在线支付,支付宝接口集成与远程调试, windows系统安装Python虚拟环境 首先保证你的系统已经安装好了Python 安装virtualenv C:\WINDOWS ...
- APP支付 + 退款(JAVA实现)
首先,你得先有微信开发平台账号密码还需要开通应用,然后还有微信服务商平台商户版账号(这些我都是给产品经理拿的) 其次我认为你先去看一看微信开发平台的文档! https://pay.weixin.qq ...
- Delphi XE7 用indy开发微信公众平台所有功能,可刷阅读,可刷赞,可加推广(除微支付)
http://www.cnblogs.com/devinlee/p/4565933.html Delphi XE7 用indy开发微信公众平台所有功能,可刷阅读,可刷赞,可加推广(除微支付) 关注作者 ...
随机推荐
- 利用 QEMU USER 模式运行 mips 程序
摘要 关键字: qemu mips 前述 QEMU是一个处理器模拟软件,可以用来在PC中模拟ARM.MIPS等多种架构的软硬件运行环境.QEMU主要有两种模拟模式: User Mode System模 ...
- [LeetCode]603. 连续空余座位(Mysql、自连接)
题目 几个朋友来到电影院的售票处,准备预约连续空余座位. 你能利用表 cinema ,帮他们写一个查询语句,获取所有空余座位,并将它们按照 seat_id 排序后返回吗? | seat_id | fr ...
- [程序员代码面试指南]最长递增子序列(二分,DP)
题目 例:arr=[2,1,5,3,6,4,8,9,7] ,最长递增子序列为1,3,4,8,9 题解 step1:找最长连续子序列长度 dp[]存以arr[i]结尾的情况下,arr[0..i]中的最长 ...
- JVM运行时数据区--本地方法栈
本地方法栈 1.Java虚拟机栈用于管理Java方法的调用,而本地方法栈用于管理本地方法(一般非Java实现的方法)的调用 2.本地方法栈,也是线程私有的. 3.允许被实现成固定或者是可动态拓展的内存 ...
- Docker实战(2):主从库搭建
入门 基于Docker的Mysql主从复制搭建 首先安装docker 拉取mysql镜像:5.7版本 启动主从数据库容器 docker run -p 3339:3306 --name Maste -e ...
- java 常用类-String-1
一.字符串相关的类 1.1 String 的特性 String类:代表字符串.Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现. String是一个fin ...
- 关于微信小程序官网的使用
我们在看微信支付相关的东西的时候,会发现有些想找的地址不好找,,没看到入口,接下来我就是整理了一下 链接: https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa ...
- C++解析XML的通用库
工作中,经常和XML打交道,最近抽空实现了一个通用解析XML的库,已归档在GitHub,详情点击:ComXmlLib.如果您无法访问GitHub,点击此处下载(链接是初版,无法和GitHub同步,如需 ...
- 曹工说Tomcat:200个http-nio-8080-exec线程全都被第三方服务拖住了,这可如何是好(上:线程模型解析)
前言 这两年,tomcat慢慢在新项目里不怎么接触了,因为都被spring boot之类的框架封装进了内部,成了内置server,不用像过去那样打个war包,再放到tomcat里部署了. 但是,内部的 ...
- 记录从Winserver2012R2升级到Winserver2019
升级系统是必不可少的,最近想搞虚拟化Hyper-V:于是着手需要装一台WIN server 2019. 手头有一台Winserver 2012R2,正好拿来测试升级,此博做一个记录. 操作流程:在升级 ...