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;
}

时间: 2024-10-13 07:18:30

C# 微支付退款申请接口 V3.3.6的相关文章

C# 微支付退款查询接口 V3.3.6

#region 微支付退款查询 string Nonce = CreateRandomCode(15).ToLower(); //生成15个随机字符string sign1 = "appid=" + PayHandle.AppID.ToString() + //微信公众号的APPID "&mch_id=" + PayHandle.MechID.ToString() + //商户号 "&nonce_str=" + Nonce + /

java使用AES-256-ECB(PKCS7Padding)解密——微信支付退款通知接口指定解密方式

1.场景 在做微信支付退款通知接口时,微信对通知的内容做了加密,并且指定用 AES256 解密,官方指定的解密方式如下: 2.导包 <!-- https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on --> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</art

游戏开发金融平台怎么对接支付平台第三方支付怎么申请接口对接

些年来第三方支付发展得非常迅速,第三方支付已经普及到各行各业中了,尤其是游戏行业,现在很多的游戏都是有充值系统的,而充值系统就是使用第三方支付的,下面小编就给大家介绍一下网络游戏申请第三方支付接口吧! 网络游戏申请第三方支付接口 网络游戏申请第三方支付接口 支付宝申请条件 1.如果您是个人签约,需要满足合作六个月以上,近三个月全部成功交易大于1000笔,金额超过5万元. 2.申请支付宝接口的需要提供淘宝同名店铺链接地址或者已经签约的支付宝及时到账.担保交易.双功能收款中的任何一款产品. 3.需要

浅析微信支付:申请退款、退款回调接口、查询退款

本文是[浅析微信支付]系列文章的第八篇,主要讲解商户如何处理微信申请退款.退款回调.查询退款接口,其中有一些坑的地方,会着重强调. 浅析微信支付系列已经更新七篇了哟-,没有看过的朋友们可以看一下哦. 浅析微信支付:查询订单和关闭订单 浅析微信支付:支付结果通知 浅析微信支付:统一下单接口 在实际场景中,申请退款和退款回调接口是比较常用到的微信支付接口,这里我们会讲原路返回方式的退款,还有的是使用直接为用户付款到零钱.现金红包等方式来退款,此种情况主要会出现在客服退款时,不是全部退款的情况,也有的

Python必备基础:这些NumPy的神操作你都掌握了吗?微交易支付通道申请微信支付接口对接支付宝支付通道搭建微盘网银扫码快捷H5支付

导读:NumPy是Python的基础,更是数据科学的通用语言. 本文简单介绍NumPy模块的两个基本对象ndarray.ufunc,介绍ndarray对象的几种生成方法及如何存取其元素.如何操作矩阵或多维数组.如何进行数据合并与展平等.最后说明通用函数及广播机制. 需要了解 JR金融项目 区块链,比特币,p2p项目,B2B网关,现货资金盘,期货招商,股票配资,商品交易所 大盘的 金融支付 第三方支付,网关支付,网银支付,银行卡支付,话费卡支付,银联代扣,支付渠道,支付宝支付,微信支付,扫码支付,

C# 微支付 JSAPI支付方式 V3.3.6版本

<script type="text/javascript">//结算 (订单号) function PayClearing(num) { $.ajax({ type: "POST", url: "/***/handler/***.ashx", data: "otype=Account&ids=" + num , async: false, success: function (msg) { if (msg

B2B商城电子商务平台网上商城系统支付通道申请第三方支付接口对接搭建 支付宝微信扫码网关网银银联快捷支付

需要了解 JR金融项目 区块链,比特币,p2p项目,B2B网关,现货资金盘,期货招商,股票配资,商品交易所 大盘的 金融支付 第三方支付,网关支付,网银支付,银行卡支付,话费卡支付,银联代扣,支付渠道,支付宝支付,微信支付,扫码支付,快捷支付,支付牌照申请,线上支付通道搭建,支付通道申请,支付接口对接,原生支付宝网关支付!独立后台,D0实时结算,API批量代付接口 JR / BC / QP 菠菜奔驰游戏等稳定安全通道!大量三方支付资质出售!请加QQ 2954704394 近年来,第三方支付发展势

金融项目股票配资融资融券资金盘专业定制系统搭建支付通道支付渠道支付接口D0实时结算平台第三方支付平台申请对接网银网关

需要了解 JR金融项目 区块链,比特币,p2p项目,B2B网关,现货资金盘,期货招商,股票配资,商品交易所 大盘的 金融支付 第三方支付,网关支付,网银支付,银行卡支付,话费卡支付,银联代扣,支付渠道,支付宝支付,微信支付,扫码支付,快捷支付,支付牌照申请,线上支付通道搭建,支付通道申请,支付接口对接,原生支付宝网关支付!独立后台,D0实时结算,API批量代付接口 JR / BC / QP 菠菜奔驰游戏等稳定安全通道!大量三方支付资质出售!请加QQ 2954704394 随着网络的发展,人们追求

BTC比特币币圈金融资金盘系统定制支付通道申请第三方支付接口对接搭建 支付宝微信扫码网关网银银联快捷支付

需要了解 JR金融项目 区块链,比特币,p2p项目,B2B网关,现货资金盘,期货招商,股票配资,商品交易所 大盘的 金融支付 第三方支付,网关支付,网银支付,银行卡支付,话费卡支付,银联代扣,支付渠道,支付宝支付,微信支付,扫码支付,快捷支付,支付牌照申请,线上支付通道搭建,支付通道申请,支付接口对接,原生支付宝网关支付!独立后台,D0实时结算,API批量代付接口 JR / BC / QP 菠菜奔驰游戏等稳定安全通道!大量三方支付资质出售!请加QQ 2954704394 三方支付平台希望发展,只