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

C# 微信支付回调验签处理的实现

程序员文章站 2022-03-13 10:01:54
目录概述c#方法概述在微信支付中,当用户支付成功后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。接收微信支付异步通知回调地址也是有要求:通知url必须为直接可访问的url,...

概述

在微信支付中,当用户支付成功后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。接收微信支付异步通知回调地址也是有要求:通知url必须为直接可访问的url,不能携带参数。

示例:notify_url:“https://pay.weixin.qq.com/wxpay/pay.action”

在微信支付开发,支付结果通用通知介绍说明页面→https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_7&index=3。

说明了:支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。

c#方法

微信支付完成后会有一个支付回调页面,处理支付完成后的事件,v3支付回调的数据形式为xml格式。

1、定义一个model类,处理一般构造函数,用于解析xml对象;

   #region  weixin app
                    // log.info(this.gettype().tostring(), "native pay mode 2 url is producing...");
                    wxpaydata data = new wxpaydata();
                    //data.setvalue("attach", model.dowhere);//附加数据
                    data.setvalue("body", model.title);//商品描述
                    data.setvalue("out_trade_no", model.localtransationno);// wxpayapi.generateouttradeno());//随机字符串
                    data.setvalue("total_fee", convert.toint32(model.amount * 100));//总金额
                    data.setvalue("time_start", datetime.now.tostring("yyyymmddhhmmss"));//交易起始时间
                    data.setvalue("time_expire", datetime.now.addminutes(10).tostring("yyyymmddhhmmss"));//交易结束时间                                                                              //data.setvalue("goods_tag", "goods_tag");//商品标记
                    data.setvalue("trade_type", "app");//交易类型
                                                       //data.setvalue("product_id", model.productid);//商品id
                    wxpaydata r = wxpayapi.unifiedorder(data);//调用统一下单接口
                    string prepay_id = r.getvalue("prepay_id").tostring();

                    wxpaydata da2 = new wxpaydata();
                    da2.setvalue("appid", wxpayconfig.appid);//公众账号id
                    da2.setvalue("noncestr", wxpayapi.generatenoncestr());//商户号
                    da2.setvalue("package", "sign=wxpay");//商品描述
                    da2.setvalue("partnerid", wxpayconfig.mchid);// wxpayapi.generateouttradeno());//随机字符串
                    da2.setvalue("prepayid", prepay_id);//总金额
                    da2.setvalue("timestamp", wxpayapi.generatetimestamp());//交易起始时间

                    #endregion

2、检查支付结果中transaction_id是否存在

  //https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7

            wxpaydata notifydata = (new com.weixin.notify(this.httpcontext)).getnotifydata();

            //检查支付结果中transaction_id是否存在
            if (!notifydata.isset("transaction_id"))
            {
                //若transaction_id不存在,则立即返回结果给微信支付后台
                wxpaydata res = new wxpaydata();
                res.setvalue("return_code", "fail");
                res.setvalue("return_msg", "支付结果中微信订单号不存在");
                log.error(this.gettype().tostring(), "the pay result is error : " + res.toxml());
                httpcontext.response.write(res.toxml());
                httpcontext.response.end();
            }

            string transaction_id = notifydata.getvalue("transaction_id").tostring();

3、查询订单,判断订单真实性

            //查询订单,判断订单真实性
            if (!queryorder(transaction_id))
            {
                //若订单查询失败,则立即返回结果给微信支付后台
                wxpaydata res = new wxpaydata();
                res.setvalue("return_code", "fail");
                res.setvalue("return_msg", "订单查询失败");
                log.error(this.gettype().tostring(), "order query failure : " + res.toxml());
                httpcontext.response.write(res.toxml());
                httpcontext.response.end();
            }
            //查询订单成功
            else
            {
                wxpaydata res = new wxpaydata();
                res.setvalue("return_code", "success");
                res.setvalue("return_msg", "ok");
                log.info(this.gettype().tostring(), "order query success : " + res.toxml());

                string trade_no = transaction_id;
                string order_no = notifydata.getvalue("out_trade_no").tostring();     //获取订单号
                string total_fee = (convert.toint32(notifydata.getvalue("total_fee").tostring()) / 100.0).tostring();       //获取总金额
                                                                                                                            //notifydata.getvalue("attach").tostring();
                httpcontext.response.write(res.toxml());
                httpcontext.response.end();

                paymentbll pbll = new paymentbll();
                bool b = pbll.paycallback(order_no, total_fee, transaction_id);
            }
        }

4、查询订单,业务处理

        //查询订单
        private bool queryorder(string transaction_id)
        {
            wxpaydata req = new wxpaydata();
            req.setvalue("transaction_id", transaction_id);
            wxpaydata res = wxpayapi.orderquery(req);
            if (res.getvalue("return_code").tostring() == "success" &&
                res.getvalue("result_code").tostring() == "success")
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        #endregion

到此这篇关于c# 微信支付回调验签处理的实现的文章就介绍到这了,更多相关c# 微信支付回调内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!