微信退款(在.net core 用http方式请求)
微信jsapi支付 申请退款
接口地址
接口链接:https://api.mch.weixin.qq.com/secapi/pay/refund
是否需要证书
请求需要双向证书。 详见
请求参数
| 字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
|---|---|---|---|---|---|
| 公众账号id | appid | 是 | string(32) | wx8888888888888888 | 微信分配的公众账号id(企业号corpid即为此appid) |
| 商户号 | mch_id | 是 | string(32) | 1900000109 | 微信支付分配的商户号 |
| 随机字符串 | nonce_str | 是 | string(32) | 5k8264iltkch16cq2502si8znmtm67vs | 随机字符串,不长于32位。推荐 |
| 签名 | sign | 是 | string(32) | c380bec2bfd727a4b6845133519f3ad6 | 签名,详见 |
| 签名类型 | sign_type | 否 | string(32) | hmac-sha256 | 签名类型,目前支持hmac-sha256和md5,默认为md5 |
| 微信订单号 | transaction_id | 二选一 | string(32) | 1217752501201407033233368018 | 微信生成的订单号,在支付通知中有返回 |
| 商户订单号 | out_trade_no | string(32) | 1217752501201407033233368018 | 商户系统内部订单号,要求32个字符内,只能是数字、大小写字母_-|*@ ,且在同一个商户号下唯一。
transaction_id、out_trade_no二选一,如果同时存在优先级:transaction_id> out_trade_no |
|
| 商户退款单号 | out_refund_no | 是 | string(64) | 1217752501201407033233368018 | 商户系统内部的退款单号,商户系统内部唯一,只能是数字、大小写字母_-|*@ ,同一退款单号多次请求只退一笔。 |
| 订单金额 | total_fee | 是 | int | 100 | 订单总金额,单位为分,只能为整数,详见 |
| 退款金额 | refund_fee | 是 | int | 100 | 退款总金额,订单总金额,单位为分,只能为整数,详见 |
| 退款货币种类 | refund_fee_type | 否 | string(8) | cny | 退款货币类型,需与支付一致,或者不填。符合iso 4217标准的三位字母代码,默认人民币:cny,其他值列表详见 |
| 退款原因 | refund_desc | 否 | string(80) | 商品已售完 |
若商户传入,会在下发给用户的退款消息中体现退款原因 注意:若订单退款金额≤1元,且属于部分退款,则不会在退款消息中体现退款原因 |
| 退款资金来源 | refund_account | 否 | string(30) | refund_source_recharge_funds |
仅针对老资金流商户使用 refund_source_unsettled_funds---未结算资金退款(默认使用未结算资金退款) refund_source_recharge_funds---可用余额退款 |
| 退款结果通知url | notify_url | 否 | string(256) | https://weixin.qq.com/notify/ |
异步接收微信支付退款结果通知的回调地址,通知url必须为外网可访问的url,不允许带参数 如果参数中传了notify_url,则商户平台上配置的回调地址将不会生效。 |
public string getwxgzhpayrefund(){
//构造请求参数
requesthandler packagereqhandler = new requesthandler();
#region 构造请求参数
packagereqhandler.setparameter("appid", wxpayconfig.appid);//appid
packagereqhandler.setparameter("mch_id", wxpayconfig.mchid);//商户号
packagereqhandler.setparameter("nonce_str", tenpayv3util.getnoncestr());//随机串
packagereqhandler.setparameter("out_refund_no", out_refund_no);
packagereqhandler.setparameter("out_trade_no", out_trade_no);//订单号
packagereqhandler.setparameter("refund_fee", (int)(convert.todecimal(refund_fee) * 100) + "");
packagereqhandler.setparameter("total_fee", (int)(convert.todecimal(total_fee) * 100) + ""); //金额,以分为单位
packagereqhandler.setparameter("transaction_id", transaction_id);
packagereqhandler.setparameter("sign", packagereqhandler.createmd5sign("key", wxpayconfig.key));//商户api密钥(签名)
//
#endregion
//将参数转为xml字符串
string data = packagereqhandler.parsexml(); //发起post异步请求,获取返回的内容
//本地或者服务器的证书位置(证书在微信支付申请成功发来的通知邮件中)
string cert = @"d:\wshh\apiclient_cert.p12";
//私钥(在安装证书时设置)
string password = wxpayconfig.mchid;
servicepointmanager.servercertificatevalidationcallback = new remotecertificatevalidationcallback(checkvalidationresult);
//调用证书
x509certificate2 cer = new x509certificate2(cert, password, x509keystorageflags.persistkeyset | x509keystorageflags.machinekeyset);
#region 发起post请求
httpwebrequest webrequest = (httpwebrequest)httpwebrequest.create(wxpayconfig.refund_url);
webrequest.clientcertificates.add(cer);
webrequest.method = "post";
byte[] postdatabyte = encoding.utf8.getbytes(data);
webrequest.contentlength = postdatabyte.length;
stream stream;
stream = webrequest.getrequeststream();
stream.write(postdatabyte, 0, postdatabyte.length);
stream.close();
httpwebresponse httpwebresponse = (httpwebresponse)webrequest.getresponse();
streamreader streamreader = new streamreader(httpwebresponse.getresponsestream());
string responsecontent = streamreader.readtoend();
#endregion
var res = system.xml.linq.xdocument.parse(responsecontent);
string return_code = res.element("xml").element("return_code").value;
hashtable hashtable = new hashtable();
hashtable.add("return_code", return_code);
return dicresult;
}
private static bool checkvalidationresult(object sender, x509certificate certificate, x509chain chain, sslpolicyerrors errors)
{
if (errors == sslpolicyerrors.none)
return true;
return false;
}
注意:
如果报:基本账户余额不足,请充值后重新发起 ,那就是基本账户余额不足, 充个一块钱就好了