微信支付----PC扫码支付(查询微信支付订单判断是否支付成功)
提示------------------几个状态没有加判断--------如:微信返回订单号不存在,微信系统异常。。。。c#webapi建议前端轮番查询订单状态#region查询扫码订单状态///<summary>///查询扫码支付状态///</summary>///<paramname="out_trade_no">支付订单号</param>///<returns></returns>[HttpGet]publicResponseMessagePayMent_Result(stringout_trade_no){if(out_trade_no!=null){PayMentpay=newPayMent();OrderDetaildetail=pay.geidingdan(out_trade_no);if(detail.trade_state=="SUCCESS")//支付成功{try{自己的业务逻辑(数据库等等操作)}catch(Exceptionex){returnnewResponseMessage{Code=-1};//系统异常}returnnewResponseMessage{Code=1};}elseif(detail.trade_state=="USERPAYING")//用户支付中{returnnewResponseMessage{Code=3};//return"3";}elseif(detail.trade_state=="NOTPAY")//未支付{returnnewResponseMessage{Code=2};//return"2";}elseif(detail.trade_state=="PAYERROR")//支付失败{returnnewResponseMessage{Code=4};//return"4";;}elseif(detail.err_code=="ORDERNOTEXIST"){returnnewResponseMessage{Code=-1,Message=detail.err_code_des};//}elseif(detail.err_code=="SYSTEMERROR"){returnnewResponseMessage{Code=-1,Message=detail.err_code_des};//}else{returnnewResponseMessage{Code=0};//其他状态}}returnnewResponseMessage{Code=-2};//支付订单号不能为空}#endregion#region返回前端使用的code_url-----自己定义API接口-----调用NATIVEPayMent方法传入方法的参数,判断返回结果如果为""说明微信统一下单失败了,可以在统一下单返回结果写入日志文件,查看失败原因。#endregion----------ENDAPI---------------------------------------------------------------------------------------------///<summary>///微信扫码支付///</summary>///<paramname="appid">公众号ID</param>///<paramname="boby">商品描述</param>///<paramname="mch_id">商户号</param>///<paramname="spbill_create_ip">终端IP</param>///<paramname="total_fee">金额</param>///<paramname="out_trade_no">商户订单号</param>///<paramname="paysignkey">证书密匙</param>///<paramname="product_id">二维码中包含的商品ID</param>///<returns></returns>publicstringNATIVEPayMent(stringboby,stringspbill_create_ip,Doubletotal_fee,stringout_trade_no,stringproduct_id){UnifiedOrderorder=newUnifiedOrder();order.appid=WXconfig.appid;order.attach="服务费";order.body=boby;order.device_info="";order.mch_id=WXconfig.mch_id;order.nonce_str=TenpayUtil.getNoncestr();order.notify_url=Wxconfig.url;order.out_trade_no=out_trade_no;order.product_id=product_id;order.trade_type="NATIVE";order.spbill_create_ip=spbill_create_ip;order.total_fee=Convert.ToInt32((total_fee)*100);TenpayUtiltenpay=newTenpayUtil();stringpaySignKey=WXconfig.paysignkey;stringcode_url=tenpay.getcode_url(order,paySignKey);returncode_url;}///<summary>///查询扫码订单情况///</summary>///<paramname="out_trade_no">商户订单号</param>///<returns></returns>publicOrderDetailgeidingdan(stringout_trade_no){TenpayUtiltenpay=newTenpayUtil();OrderDetaildetail=tenpay.getOrderDetail(out_trade_no);returndetail;}publicclassTenpayUtil{#regionurl///<summary>///统一支付接口///</summary>conststringUnifiedPayUrl="https://api.mch.weixin.qq.com/pay/unifiedorder";///<summary>///网页授权接口///</summary>conststringaccess_tokenUrl="https://api.weixin.qq.com/sns/oauth3/access_token";///<summary>///微信订单查询接口///</summary>conststringOrderQueryUrl="https://api.mch.weixin.qq.com/pay/orderquery";#endregion#region随机串,时间截///<summary>///随机串///</summary>publicstaticstringgetNoncestr(){Randomrandom=newRandom();returnMD5Util.GetMD5(random.Next(1000).ToString(),"GBK").ToLower().Replace("s","S");}///<summary>///时间截,自1970年以来的秒数///</summary>publicstaticstringgetTimestamp(){TimeSpants=DateTime.UtcNow-newDateTime(1970,1,1,0,0,0,0);returnConvert.ToInt64(ts.TotalSeconds).ToString();}#endregion///<summary>///网页授权接口///</summary>publicstaticstringgetAccess_tokenUrl(){returnaccess_tokenUrl;}#region把微信扫码支付的回调XML转换集合publicstringGetXml(stringxmlstring){SortedDictionary<string,object>sd=GetInfoFromXml(xmlstring);stringreslut="";foreach(KeyValuePair<string,object>sinsd){if(s.Key=="result_code"){reslut=s.Value.ToString();}}returnreslut;}#endregion#region获取微信签名///<summary>///获取微信签名///</summary>///<paramname="sParams"></param>///<returns></returns>publicstringgetsign(SortedDictionary<string,object>sParams,stringkey){inti=0;stringsign=string.Empty;StringBuildersb=newStringBuilder();foreach(KeyValuePair<string,object>tempinsParams){if(temp.Value.ToString()==""||temp.Value==null||temp.Key.ToLower()=="sign"){continue;}i++;sb.Append(temp.Key.Trim()+"="+temp.Value.ToString()+"&");}sb.Append("key="+key.Trim()+"");stringsignkey=sb.ToString();sign=MD5Util.GetMD5(signkey,"utf-8");//utf-8returnsign;}#endregion#regionpost数据到指定接口并返回数据///<summary>///post数据到指定接口并返回数据///</summary>publicstringPostXmlToUrl(stringurl,stringpostData,stringtype=""){stringreturnmsg="";using(System.Net.WebClientwc=newSystem.Net.WebClient()){if(type!=""){Encodingencoding=Encoding.UTF8;wc.Encoding=System.Text.Encoding.GetEncoding("GB2312");byte[]data=encoding.GetBytes(postData);returnmsg=Encoding.UTF8.GetString(wc.UploadData(url,"POST",data));}elsereturnmsg=wc.UploadString(url,"POST",postData);}returnreturnmsg;}#endregion#region获取code_url///<summary>///获取code_url///</summary>publicstringgetcode_url(UnifiedOrderorder,stringkey){stringcode_url="";stringpost_data=getUnifiedOrderXml(order,key);stringrequest_data=PostXmlToUrl(UnifiedPayUrl,post_data);//stringrequest_data=HttpRequestutil.RequestUrl(UnifiedPayUrl,post_data,"post");SortedDictionary<string,object>requestXML=GetInfoFromXml(request_data);foreach(KeyValuePair<string,object>kinrequestXML){if(k.Key=="code_url"){code_url=k.Value.ToString();break;}}returncode_url;}#endregion#region获取prepay_id///<summary>///获取prepay_id///</summary>publicstringgetPrepay_id(UnifiedOrderorder,stringkey){stringprepay_id="";stringpost_data=getUnifiedOrderXml(order,key);stringrequest_data=PostXmlToUrl(UnifiedPayUrl,post_data);SortedDictionary<string,object>requestXML=GetInfoFromXml(request_data);foreach(KeyValuePair<string,object>kinrequestXML){if(k.Key=="prepay_id"){prepay_id=k.Value.ToString();break;}}returnprepay_id;}#endregion#region获取微信订单明细///<summary>///获取微信订单明细///</summary>publicOrderDetailgetOrderDetail(stringout_trade_no){stringpost_data=getQueryOrderXml(out_trade_no);stringrequest_data=PostXmlToUrl(OrderQueryUrl,post_data,"1");OrderDetailorderdetail=newOrderDetail();SortedDictionary<string,object>requestXML=GetInfoFromXml(request_data);foreach(KeyValuePair<string,object>kinrequestXML){switch(k.Key){case"retuen_code":orderdetail.result_code=k.Value.ToString();break;case"return_msg":orderdetail.return_msg=k.Value.ToString();break;case"appid":orderdetail.appid=k.Value.ToString();break;case"mch_id":orderdetail.mch_id=k.Value.ToString();break;case"nonce_str":orderdetail.nonce_str=k.Value.ToString();break;case"sign":orderdetail.sign=k.Value.ToString();break;case"result_code":orderdetail.result_code=k.Value.ToString();break;case"err_code":orderdetail.err_code=k.Value.ToString();break;case"err_code_des":orderdetail.err_code_des=k.Value.ToString();break;case"trade_state":orderdetail.trade_state=k.Value.ToString();break;case"device_info":orderdetail.device_info=k.Value.ToString();break;case"openid":orderdetail.openid=k.Value.ToString();break;case"is_subscribe":orderdetail.is_subscribe=k.Value.ToString();break;case"trade_type":orderdetail.trade_type=k.Value.ToString();break;case"bank_type":orderdetail.bank_type=k.Value.ToString();break;case"total_fee":orderdetail.total_fee=k.Value.ToString();break;case"coupon_fee":orderdetail.coupon_fee=k.Value.ToString();break;case"fee_type":orderdetail.fee_type=k.Value.ToString();break;case"transaction_id":orderdetail.transaction_id=k.Value.ToString();break;case"out_trade_no":orderdetail.out_trade_no=k.Value.ToString();break;case"attach":orderdetail.attach=k.Value.ToString();break;case"time_end":orderdetail.time_end=k.Value.ToString();break;default:break;}}returnorderdetail;}#endregion#region#region把XML数据转换为SortedDictionary///<summary>///把XML数据转换为SortedDictionary<string,string>集合///</summary>///<paramname="strxml"></param>///<returns></returns>protectedSortedDictionary<string,object>GetInfoFromXml(stringxmlstring){SortedDictionary<string,object>sParams=newSortedDictionary<string,object>();try{XmlDocumentdoc=newXmlDocument();doc.LoadXml(xmlstring);XmlElementroot=doc.DocumentElement;intlen=root.ChildNodes.Count;for(inti=0;i<len;i++){stringname=root.ChildNodes[i].Name;if(!sParams.ContainsKey(name)){sParams.Add(name.Trim(),root.ChildNodes[i].InnerText.Trim());}}}catch(Exceptionex){}returnsParams;}#endregion#region微信统一下单接口xml参数整理///<summary>///微信统一下单接口xml参数整理///</summary>///<paramname="order">微信支付参数实例</param>///<paramname="key">密钥</param>///<returns></returns>protectedstringgetUnifiedOrderXml(UnifiedOrderorder,stringkey){stringreturn_string=string.Empty;SortedDictionary<string,object>sParams=newSortedDictionary<string,object>();sParams.Add("appid",order.appid);sParams.Add("attach",order.attach);sParams.Add("body",order.body);sParams.Add("device_info",order.device_info);sParams.Add("mch_id",order.mch_id);sParams.Add("nonce_str",order.nonce_str);sParams.Add("notify_url",order.notify_url);//当trade_type=JSAPI时必输入if(order.trade_type=="JSAPI"){sParams.Add("openid",order.openid);}elseif(order.trade_type=="NATIVE"){//当trade_type=NATIVE时必输入sParams.Add("product_id",order.product_id);}sParams.Add("out_trade_no",order.out_trade_no);sParams.Add("spbill_create_ip",order.spbill_create_ip);sParams.Add("total_fee",order.total_fee);sParams.Add("trade_type",order.trade_type);order.sign=getsign(sParams,key);sParams.Add("sign",order.sign);//拼接成XML请求数据StringBuildersbPay=newStringBuilder();foreach(KeyValuePair<string,object>kinsParams){if(k.Key=="attach"||k.Key=="body"||k.Key=="sign"){sbPay.Append("<"+k.Key+"><![CDATA["+k.Value+"]]></"+k.Key+">");}else{sbPay.Append("<"+k.Key+">"+k.Value+"</"+k.Key+">");}}return_string=string.Format("<xml>{0}</xml>",sbPay.ToString());byte[]byteArray=Encoding.UTF8.GetBytes(return_string);return_string=Encoding.GetEncoding("GBK").GetString(byteArray);Byte[]temp=Encoding.UTF8.GetBytes(return_string);stringdataGBK=Encoding.GetEncoding("utf-8").GetString(temp);returnreturn_string;//GBK}#endregion#region微信订单查询接口XML参数整理///<summary>///微信订单查询接口XML参数整理///</summary>///<paramname="queryorder">微信订单查询参数实例</param>///<paramname="key">密钥</param>///<returns></returns>protectedstringgetQueryOrderXml(stringout_trade_no){stringreturn_string=string.Empty;SortedDictionary<string,object>sParams=newSortedDictionary<string,object>();sParams.Add("appid",WXconfig.appid);sParams.Add("mch_id",WXconfig.mch_id);//sParams.Add("transaction_id",queryorder.transaction_id);sParams.Add("out_trade_no",out_trade_no);sParams.Add("nonce_str",getNoncestr());stringsign=getsign(sParams,WXconfig.paysignkey);sParams.Add("sign",sign);//拼接成XML请求数据StringBuildersbPay=newStringBuilder();foreach(KeyValuePair<string,object>kinsParams){if(k.Key=="attach"||k.Key=="body"||k.Key=="sign"){sbPay.Append("<"+k.Key+"><![CDATA["+k.Value+"]]></"+k.Key+">");}else{sbPay.Append("<"+k.Key+">"+k.Value+"</"+k.Key+">");}}return_string=string.Format("<xml>{0}</xml>",sbPay.ToString().TrimEnd(','));returnreturn_string;}#endregion#endregion}publicclassMD5Util{publicMD5Util(){////TODO:在此处添加构造函数逻辑//}///<summary>////**获取大写的MD5签名结果*////</summary>///<paramname="encypStr">数据</param>///<paramname="charset">编码格式</param>///<returns></returns>publicstaticstringGetMD5(stringencypStr,stringcharset){stringretStr;MD5CryptoServiceProviderm5=newMD5CryptoServiceProvider();//创建md5对象byte[]inputBye;byte[]outputBye;//使用GB2312编码方式把字符串转化为字节数组.try{inputBye=Encoding.GetEncoding(charset).GetBytes(encypStr);}catch(Exceptionex){inputBye=Encoding.GetEncoding("GB2312").GetBytes(encypStr);}outputBye=m5.ComputeHash(inputBye);retStr=System.BitConverter.ToString(outputBye);retStr=retStr.Replace("-","").ToUpper();returnretStr;}///<summary>///SHA1加密///</summary>///<paramname="str"></param>///<returns></returns>publicstaticstringsha1(stringstr){returnSystem.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str,"sha1").ToLower();}}
请求方式:http get
接口参数说明
名称
类型
必填
说明
out_trade_no
String
是
支付订单ID
返回结果: code :1//支付成功
返回结果: code :2//未支付
返回结果: code :3//用户支付中
返回结果: code :4//支付失败
返回结果: code :0//其他状态
返回结果: code :-1,Message="错误信息"//系统异常
返回结果: code :-2//订单号不能为空
备注:(code 不为-1,1,-2的时候轮番调取接口,建议时间为1s~2s,为-1的时候,提示系统异常,联系管理员。为1的时候跳到完成页面。)
订单查询说明:微信支付虽然有回调(个人认为比较坑),这里我是用了自己支付订单号去查询微信支付的该订单状态。(微信文档有说明,有2个方式,一个回调,一个用支付订单查询订单状态)
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。