欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

微信退款(在.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;
        }

注意:

  如果报:基本账户余额不足,请充值后重新发起   ,那就是基本账户余额不足, 充个一块钱就好了