微信退款(在.net core 用http方式请求)
程序员文章站
2023-01-28 10:29:46
微信JSAPI支付 申请退款 接口地址 接口链接:https://api.mch.weixin.qq.com/secapi/pay/refund 是否需要证书 请求需要双向证书。 详见证书使用 请求参数 字段名变量名必填类型示例值描述 公众账号ID appid 是 String(32) wx8888 ......
微信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; }
注意:
如果报:基本账户余额不足,请充值后重新发起 ,那就是基本账户余额不足, 充个一块钱就好了