需求:自助机调用接口生成二维码,用户扫描二维码付款后,回调方法里写入到数据库,自助机轮询查数据库判断用户是否付款。

  1 using bk.Services.Log;
2 using bk.web.Common.Alipay;
3 using bk.web.Common.Weixin;
4 using System.Collections.Generic;
5 using System.Collections.Specialized;
6 using System.Text;
7 using System.Web;
8 using System.Web.Mvc;
9 using Com.Alipay;
10 using Com.Alipay.Business;
11 using Com.Alipay.Domain;
12 using Com.Alipay.Model;
13 using System;
14 using bk.web.Models;
15 using bk.Core.Domain;
16 using System.IO;
17 using bk.Core;
18 using bk.Services.Admin;
19 using System.Threading.Tasks;
20 using bk.Core.Infrastructure;
21 using System.Linq;
22 using System.Configuration;
23
24 namespace bk.web.Controllers
25 {
26 public class PayNotifyController : Controller
27 {
28 private readonly IAgent_User_ImgService _userService;
29 private readonly IAgentOperationPayService _payService;
30 private readonly IAgentOperationService _operateService;
31 private readonly IAgentDevice_PayService _amountService;
32 public PayNotifyController(
33 IAgent_User_ImgService userService,
34 IAgentOperationPayService payService,
35 IAgentOperationService operateService,
36 IAgentDevice_PayService amountService)
37 {
38 this._userService = userService;
39 _payService = payService;
40 _operateService = operateService;
41 _amountService = amountService;
42 }
43
44 // GET: PayNotify
45 public ActionResult Index()
46 {
47 return View();
48 }
49
50 #region 微信支付回调
51 /// <summary>
52 /// 支付结果通知回调处理类
53 /// 负责接收微信支付后台发送的支付结果并对订单有效性进行验证,将验证结果反馈给微信支付后台
54 /// </summary>
55 public void wxNotify()
56 {
57 Log.Info(this.GetType().ToString(), "微信支付回调开始");
58
59 WxPayData notifyData = GetNotifyData();
60 //检查支付结果中transaction_id是否存在
61 if (!notifyData.IsSet("transaction_id"))
62 {
63 //若transaction_id不存在,则立即返回结果给微信支付后台
64 WxPayData res = new WxPayData();
65 res.SetValue("return_code", "FAIL");
66 res.SetValue("return_msg", "支付结果中微信订单号不存在");
67 Log.Error(this.GetType().ToString(), "The Pay result is error : " + res.ToXml());
68 Response.Write(res.ToXml());
69 Response.End();
70 }
71
72 string transaction_id = notifyData.GetValue("transaction_id").ToString();
73
74 //查询订单,判断订单真实性
75 if (!QueryOrder(transaction_id))
76 {
77 //若订单查询失败,则立即返回结果给微信支付后台
78 WxPayData res = new WxPayData();
79 res.SetValue("return_code", "FAIL");
80 res.SetValue("return_msg", "订单查询失败");
81 Log.Error(this.GetType().ToString(), "Order query failure : " + res.ToXml());
82 Response.Write(res.ToXml());
83 Response.End();
84 }
85 //查询订单成功
86 else
87 {
88 //更新数据库
89 //WriteLog.Debug("notifyData begin:");
90 //var dicValue = notifyData.GetValues();
91 //foreach (var item in dicValue)
92 //{
93 // WriteLog.Debug(item.Key + " : " + item.Value);
94 //}
95 //WriteLog.Debug("notifyData end;");
96 string out_trade_no = notifyData.GetValue("out_trade_no").ToString();
97 UpdatePayData(1, out_trade_no, transaction_id);
98
99 WxPayData res = new WxPayData();
100 res.SetValue("return_code", "SUCCESS");
101 res.SetValue("return_msg", "OK");
102 Log.Info(this.GetType().ToString(), "order query success : " + res.ToXml());
103
104 Response.Write(res.ToXml());
105 Response.End();
106 }
107
108 }
109
110 private void UpdatePayData(int payType, string out_trade_no, string transaction_id)
111 {
112 //更新AgentOperationPay
113 M_AgentOperationPay m = _payService.GetByOrderNo(out_trade_no);
114 if (m == null)
115 {
116
117 }
118 else
119 {
120 m.SerialNo = transaction_id;
121 m.Payment = payType;
122 m.PayStatus = 1;
123 _payService.Update(m);
124
125 //更新AgentOperation
126 M_AgentOperation om = _operateService.GetByOperationNo(m.OperationNo);
127 om.Status = 1;
128 _operateService.Update(om);
129 }
130 }
131
132 /// <summary>
133 /// 接收从微信支付后台发送过来的数据并验证签名
134 /// </summary>
135 /// <returns>微信支付后台返回的数据</returns>
136 public WxPayData GetNotifyData()
137 {
138 //接收从微信后台POST过来的数据
139 System.IO.Stream s = Request.InputStream;
140 int count = 0;
141 byte[] buffer = new byte[1024];
142 StringBuilder builder = new StringBuilder();
143 while ((count = s.Read(buffer, 0, 1024)) > 0)
144 {
145 builder.Append(Encoding.UTF8.GetString(buffer, 0, count));
146 }
147 s.Flush();
148 s.Close();
149 s.Dispose();
150
151 WriteLog.Debug("Receive data from WeChat : " + builder.ToString());
152
153 //转换数据格式并验证签名
154 WxPayData data = new WxPayData();
155 try
156 {
157 data.FromXml(builder.ToString());
158 }
159 catch (WxPayException ex)
160 {
161 //若签名错误,则立即返回结果给微信支付后台
162 WxPayData res = new WxPayData();
163 res.SetValue("return_code", "FAIL");
164 res.SetValue("return_msg", ex.Message);
165 WriteLog.Debug("Sign check error : " + res.ToXml());
166 Response.Write(res.ToXml());
167 Response.End();
168 }
169
170 WriteLog.Debug("Check sign success");
171 return data;
172 }
173 //查询订单
174 private bool QueryOrder(string transaction_id)
175 {
176 WxPayData req = new WxPayData();
177 req.SetValue("transaction_id", transaction_id);
178 WxPayData res = WxPayApi.OrderQuery(req);
179 if (res.GetValue("return_code").ToString() == "SUCCESS" &&
180 res.GetValue("result_code").ToString() == "SUCCESS")
181 {
182 return true;
183 }
184 else
185 {
186 return false;
187 }
188 }
189 #endregion
190
191 #region 支付宝回调
192 public void aliNotify()
193 {
194 WriteLog.Debug("支付宝回调开始");
195 WriteLog.Debug("aliNotify : begin");
196 SortedDictionary<string, string> sPara = GetRequestPost();
197
198 if (sPara.Count > 0)//判断是否有带返回参数
199 {
200 //Notify aliNotify = new Notify();
201 Com.Alipay.Notify aliNotify = new Com.Alipay.Notify(Config.charset, Config.sign_type, Config.pid, Config.mapiUrl, Config.alipay_public_key);
202
203 //对异步通知进行验签
204 bool verifyResult = aliNotify.Verify(sPara, Request.Form["notify_id"], Request.Form["sign"]);
205 //对验签结果
206 //bool isSign = Aop.Api.Util.AlipaySignature.RSACheckV2(sPara, Config.alipay_public_key ,Config.charset,Config.sign_type,false );
207
208 if (verifyResult && CheckParams()) //验签成功 && 关键业务参数校验成功
209 {
210 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
211 //请在这里加上商户的业务逻辑程序代码
212
213
214 //——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
215 //获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表
216
217 //商户订单号
218 string out_trade_no = Request.Form["out_trade_no"];
219
220
221 //支付宝交易号
222 string trade_no = Request.Form["trade_no"];
223
224 //交易状态
225 //在支付宝的业务通知中,只有交易通知状态为TRADE_SUCCESS或TRADE_FINISHED时,才是买家付款成功。
226 string trade_status = Request.Form["trade_status"];
227
228 //更新数据库
229 if (trade_status == "TRADE_SUCCESS" || trade_status == "TRADE_FINISHED")
230 {
231 UpdatePayData(2, out_trade_no, trade_no);
232 }
233
234 //判断是否在商户网站中已经做过了这次通知返回的处理
235 //如果没有做过处理,那么执行商户的业务程序
236 //如果有做过处理,那么不执行商户的业务程序
237
238 WriteLog.Debug("aliNotify : success");
239 Response.Write("success"); //请不要修改或删除
240
241 //——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
242
243 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
244 }
245 else//验证失败
246 {
247 WriteLog.Debug("aliNotify : fail");
248 Response.Write("fail");
249 }
250 }
251 else
252 {
253 WriteLog.Debug("aliNotify : 无通知参数");
254 Response.Write("无通知参数");
255 }
256 }
257 /// <summary>
258 /// 获取支付宝POST过来通知消息,并以“参数名=参数值”的形式组成数组
259 /// </summary>
260 /// <returns>request回来的信息组成的数组</returns>
261 public SortedDictionary<string, string> GetRequestPost()
262 {
263 int i = 0;
264 SortedDictionary<string, string> sArray = new SortedDictionary<string, string>();
265 NameValueCollection coll;
266 //Load Form variables into NameValueCollection variable.
267 coll = Request.Form;
268
269 // Get names of all forms into a string array.
270 string[] requestItem = coll.AllKeys;
271
272 for (i = 0; i < requestItem.Length; i++)
273 {
274 sArray.Add(requestItem[i], Request.Form[requestItem[i]]);
275 WriteLog.Debug("aliNotify : GetRequestPost, key="+ requestItem[i] + ",value="+ Request.Form[requestItem[i]]);
276 }
277
278 return sArray;
279 }
280
281
282 /// <summary>
283 /// 对支付宝异步通知的关键参数进行校验
284 /// </summary>
285 /// <returns></returns>
286 private bool CheckParams()
287 {
288 bool ret = true;
289
290 //获得商户订单号out_trade_no
291 string out_trade_no = Request.Form["out_trade_no"];
292 //TODO 商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,
293
294 //获得支付总金额total_amount
295 string total_amount = Request.Form["total_amount"];
296 //TODO 判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),
297
298 //获得卖家账号seller_email
299 string seller_email = Request.Form["seller_email"];
300 //TODO 校验通知中的seller_email(或者seller_id) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id / seller_email)
301
302 //获得调用方的appid;
303 //如果是非授权模式,appid是商户的appid;如果是授权模式(token调用),appid是系统商的appid
304 string app_id = Request.Form["app_id"];
305 //TODO 验证app_id是否是调用方的appid;。
306
307 //验证上述四个参数,完全吻合则返回参数校验成功
308 return ret;
309
310 }
311
312 #endregion
313
314 #region 微信、支付宝生成二维码url
315 public JsonResult GetWxAliCodeUrl(WxAliPayRequestOnlyUrl req)
316 {
317 WriteLog.Debug("计时:开始时间=" + DateTime.Now.ToString());
318 WxAliPayResponse result = new WxAliPayResponse();
319
320 #region 业务参数判断 和 签名判断--占不加业务
321
322 //bool have_err = false;
323 //string err_msg = "缺少参数:";
324 //if (req == null)
325 //{
326 // result.Code = "1000";
327 // result.Msg = "传入参数为空";
328 // return Json(result);
329 //}
330
331 //if (string.IsNullOrEmpty(req.file_name))
332 //{
333 // have_err = true;
334 // err_msg += "文件名称不能为空";
335 //}
336 //if (string.IsNullOrEmpty(req.sign))
337 //{
338 // have_err = true;
339 // err_msg += "、签名不能为空";
340 //}
341 //if (string.IsNullOrEmpty(req.avatar))
342 //{
343 // have_err = true;
344 // err_msg += "、照片不能为空";
345 //}
346 //if (req.time_stamp <= 0)
347 //{
348 // have_err = true;
349 // err_msg += "、请传入正确的时间戳格式";
350 //}
351 //if (string.IsNullOrEmpty(req.SFZMHM))
352 //{
353 // have_err = true;
354 // err_msg += "身份证明号码不能为空";
355 //}
356 //if (string.IsNullOrEmpty(req.SFZMMC))
357 //{
358 // have_err = true;
359 // err_msg += "身份证明名称不能为空";
360 //}
361 //if (string.IsNullOrEmpty(req.SFZMLX))
362 //{
363 // have_err = true;
364 // err_msg += "身份证明类型不能为空";
365 //}
366 //if (req.Img_Type != 1 && req.Img_Type != 2 && req.Img_Type != 3)
367 //{
368 // have_err = true;
369 // err_msg += "照片类型格式不正确";
370 //}
371 //if (string.IsNullOrEmpty(req.OperationNo))
372 //{
373 // have_err = true;
374 // err_msg += "操作编号不能为空";
375 //}
376 //if (have_err)
377 //{
378 // //commonHelper.write_log("1001图片接口上传失败", err_msg);
379 // result.Code = "1001";
380 // result.Msg = err_msg;
381 // return Json(result);
382 //}
383 //string strtime_stamp = ConfigurationManager.AppSettings["time_stamp"];
384 //int intTimeStampCfg = 600;
385 //int.TryParse(strtime_stamp, out intTimeStampCfg);
386 //if (Math.Abs(CommonHelper.GetCurrentTimeStamp() - req.time_stamp) > intTimeStampCfg)
387 //{
388 // //commonHelper.write_log("1002图片接口上传失败", "请求过期----当前时间:" + commonHelper.GetCurrentTimeStamp() + "------传入时间:" + model.time_stamp);
389 // result.Code = "1002";
390 // result.Msg = "请求过期";
391 // return Json(result);
392 //}
393 //string api_user_key = ConfigurationManager.AppSettings["upload_img_key"];
394 //string mysign = string.Format("apikey={0}&time_stamp={1}&file_name={2}&operationNo={3}", api_user_key, req.time_stamp, req.file_name, req.OperationNo);
395 //mysign = CommonHelper.MD5Encrypt(mysign, 32);
396 //mysign = mysign.ToLower();
397 //WriteLog.Debug("GetWxAliCodeUrl: mysign="+ mysign + ", 签名参数sign="+ req.sign.ToLower());
398 //if (req.sign.ToLower() != mysign)
399 //{
400 // //commonHelper.write_log("1003图片接口上传失败", "签名不匹配----传入的签名:" + model.sign.ToLower() + "------正确的签名:" + mysign);
401 // result.Code = "1003";
402 // result.Msg = "签名不匹配";
403 // return Json(result);
404 //}
405 //WriteLog.Debug("业务参数判断 和 签名判断 成功");
406
407 #endregion
408
409 #region 判断参数
410 if (req == null)
411 {
412 result.Code = "1000";
413 result.Msg = "传入参数为空";
414 return Json(result);
415 }
416 if (string.IsNullOrEmpty(req.deviceNo))
417 {
418 result.Code = "1001";
419 result.Msg = "设备号不能为空";
420 return Json(result);
421 }
422 if (string.IsNullOrEmpty(req.busyCode))
423 {
424 result.Code = "1002";
425 result.Msg = "业务编号不能为空";
426 return Json(result);
427 }
428 if (string.IsNullOrEmpty(req.OperationNo))
429 {
430 result.Code = "1003";
431 result.Msg = "操作编号不能为空";
432 return Json(result);
433 }
434 if (string.IsNullOrEmpty(req.sign))
435 {
436 result.Code = "1004";
437 result.Msg = "签名不能为空";
438 return Json(result);
439 }
440 if (req.time_stamp <= 0)
441 {
442 result.Code = "1005";
443 result.Msg = "请传入正确的时间戳格式";
444 return Json(result);
445 }
446 string strtime_stamp = ConfigurationManager.AppSettings["time_stamp"];
447 int intTimeStampCfg = 600;
448 int.TryParse(strtime_stamp, out intTimeStampCfg);
449 if (Math.Abs(CommonHelper.GetCurrentTimeStamp() - req.time_stamp) > intTimeStampCfg)
450 {
451 //commonHelper.write_log("1002图片接口上传失败", "请求过期----当前时间:" + commonHelper.GetCurrentTimeStamp() + "------传入时间:" + model.time_stamp);
452 result.Code = "1006";
453 result.Msg = "请求过期";
454 return Json(result);
455 }
456 string api_user_key = ConfigurationManager.AppSettings["upload_img_key"];
457 string mysign = string.Format("apikey={0}&deviceNo={1}&busyCode={2}&OperationNo={3}&time_stamp={4}", api_user_key, req.deviceNo, req.busyCode, req.OperationNo, req.time_stamp);
458 mysign = CommonHelper.MD5Encrypt(mysign, 32);
459 mysign = mysign.ToLower();
460 if (!req.sign.ToLower().Equals(mysign))
461 {
462 //commonHelper.write_log("1003图片接口上传失败", "签名不匹配----传入的签名:" + model.sign.ToLower() + "------正确的签名:" + mysign);
463 result.Code = "1007";
464 result.Msg = "签名不匹配";
465 return Json(result);
466 }
467 #endregion
468
469 string WxCode = "", WxCodeUrl = "", AliCodeUrl = "", AliCode = "", Str_Out_trade_no = "";
470 //订单号
471 Str_Out_trade_no = GetOut_trade_no();
472 //商品ID
473 string Str_productId = GetRandom(9);
474 //金额
475 string strAmount = GetAmount(req.deviceNo, req.busyCode, req.isTest);
476 string Str_total_amount = strAmount;// "0.01";//支付宝支付金额,以 元 为单位
477 int Int_total_amount = ParIntForWeixin(strAmount);// 1;//微信支付金额,以 分 为单位
478
479 #region weixin
480 NativePay nativePay = new NativePay();
481
482 //生成扫码支付模式二url
483 string url2 = nativePay.GetPayUrl(Str_Out_trade_no, Str_productId, Int_total_amount);
484
485 Log.Info(this.GetType().ToString(), "WeiXinNativePay url2 : " + url2);
486
487 WxCode = "SUCCESS";
488 WxCodeUrl = HttpUtility.UrlEncode(url2);
489
490 #endregion
491
492 #region ali
493 AlipayTradePrecreateContentBuilder builder = BuildPrecreateContent(Str_Out_trade_no, Str_productId, Str_total_amount);
494 //string out_trade_no = builder.out_trade_no;
495
496 //推荐使用轮询撤销机制,不推荐使用异步通知,避免单边账问题发生。
497 IAlipayTradeService serviceClient = F2FBiz.CreateClientInstance(Config.serverUrl, Config.appId, Config.merchant_private_key, Config.version,
498 Config.sign_type, Config.alipay_public_key, Config.charset);
499
500 string notify_url = Config.NotifyUrl; //商户接收异步通知的地址
501 AlipayF2FPrecreateResult precreateResult = serviceClient.tradePrecreate(builder, notify_url);
502
503 //以下返回结果的处理供参考。
504 //payResponse.QrCode即二维码对于的链接
505 //将链接用二维码工具生成二维码,顾客可以用支付宝钱包扫码支付。
506 switch (precreateResult.Status)
507 {
508 case ResultEnum.SUCCESS:
509 AliCode = "SUCCESS";
510 AliCodeUrl = HttpUtility.UrlEncode(precreateResult.response.QrCode);
511 break;
512 case ResultEnum.FAILED:
513 AliCode = "FAILED";
514 AliCodeUrl = precreateResult.response.Body;
515 break;
516 case ResultEnum.UNKNOWN:
517 AliCode = "UNKNOWN";
518 if (precreateResult.response == null)
519 {
520 AliCodeUrl = "配置或网络异常,请检查后重试";
521 }
522 else
523 {
524 AliCodeUrl = "系统异常,请更新外部订单后重新发起请求";
525 }
526 break;
527 }
528
529 #endregion
530
531 //处理业务数据,存图片、写数据库
532 Task.Run(()=> WritePayDataNew(req, Str_Out_trade_no));
533
534 WriteLog.Debug("计时:结束时间=" + DateTime.Now.ToString());
535 result.Code = "200";
536 result.Msg = "成功";
537 result.WxCode = WxCode;
538 result.WxCodeUrl = WxCodeUrl;
539 result.AliCode = AliCode;
540 result.AliCodeUrl = AliCodeUrl;
541 result.Out_trade_no = Str_Out_trade_no;
542 return Json(result);
543 }
544
545 private int ParIntForWeixin(string strAmount)
546 {
547 double p = 0;
548 double.TryParse(strAmount, out p);
549 int intp = (int)(p * 100);
550 if (intp == 0)
551 return 20 * 100;
552 else
553 return intp;
554 }
555
556 private string GetAmount(string deviceNo, string busyCode, string isTest)
557 {
558 var strTest = string.IsNullOrEmpty(isTest) ? "" : isTest;
559 if (strTest.Equals("1"))
560 {
561 //测试用,金额为配置的0.01
562 string TestamountPrice = ConfigurationManager.AppSettings["TestamountPrice"];
563 if (string.IsNullOrEmpty(TestamountPrice))
564 return "0.01";
565 else
566 return TestamountPrice;
567 }
568 else
569 {
570 IQueryable<M_AgentDevice_Pay> q = _amountService.GetByNoCode(deviceNo, busyCode);
571 var ls = q.ToList();
572 if (ls == null || ls.Count < 1)
573 {
574 string amountPrice = ConfigurationManager.AppSettings["amountPrice"];
575 if (string.IsNullOrEmpty(amountPrice))
576 return "20";
577 else
578 return amountPrice;
579 }
580 else
581 {
582 return ls[0].PayAmount;
583 }
584 }
585 }
586
587 /// <summary>
588 /// 支付宝 构造支付请求数据
589 /// </summary>
590 /// <returns>请求数据集</returns>
591 private AlipayTradePrecreateContentBuilder BuildPrecreateContent(string Str_Out_trade_no, string Str_productId, string Str_total_amount)
592 {
593 //bkin 三个参数:out_trade_no total_amount subject
594
595 //线上联调时,请输入真实的外部订单号。
596 string out_trade_no = Str_Out_trade_no;
597
598 AlipayTradePrecreateContentBuilder builder = new AlipayTradePrecreateContentBuilder();
599 //收款账号
600 builder.seller_id = Config.pid;
601 //订单编号
602 builder.out_trade_no = out_trade_no;
603 //订单总金额
604 builder.total_amount = Str_total_amount;
605 //参与优惠计算的金额
606 //builder.discountable_amount = "";
607 //不参与优惠计算的金额
608 //builder.undiscountable_amount = "";
609 //订单名称
610 builder.subject = "证件照";
611 //自定义超时时间
612 builder.timeout_express = "5m";
613 //订单描述
614 builder.body = "";
615 //门店编号,很重要的参数,可以用作之后的营销
616 builder.store_id = "test store id";
617 //操作员编号,很重要的参数,可以用作之后的营销
618 builder.operator_id = "证件照";
619
620 //传入商品信息详情
621 List<GoodsInfo> gList = new List<GoodsInfo>();
622 GoodsInfo goods = new GoodsInfo();
623 goods.goods_id = Str_productId;
624 goods.goods_name = "证件照";
625 goods.price = Str_total_amount;
626 goods.quantity = "1";
627 gList.Add(goods);
628 builder.goods_detail = gList;
629
630 //系统商接入可以填此参数用作返佣
631 //ExtendParams exParam = new ExtendParams();
632 //exParam.sysServiceProviderId = "20880000000000";
633 //builder.extendParams = exParam;
634
635 return builder;
636 }
637
638 private void WritePayData(WxAliPayRequest req, string Str_Out_trade_no)
639 {
640 WriteLog.Debug("WritePayData begin");
641 if (req == null)
642 return;
643 var filePath = Base64_to_File(req.avatar);
644
645 //
646 var _payService1 = EngineContext.Current.Resolve<IAgent_User_ImgService>();
647 var _payService2 = EngineContext.Current.Resolve<IAgentOperationPayService>();
648 var _payService3 = EngineContext.Current.Resolve<IAgentOperationService>();
649
650 //插入 Agent_User_Img 表
651 var m = new M_Agent_User_Img()
652 {
653 SFZMHM = req.SFZMHM,
654 SFZMMC = req.SFZMMC,
655 SFZMLX = req.SFZMLX,
656 Img_Type = req.Img_Type,
657 Img_Url = filePath,
658 OperationNo = req.OperationNo,
659 Img_Spec = req.Img_Spec,
660 Create_Time = DateTime.Now,
661 IsDeleted = false
662 };
663 _payService1.Insert(m);
664
665 //插入 AgentOperationPay 表
666 var m2 = new M_AgentOperationPay()
667 {
668 Payment = 0,//支付成功回调更新为 (1, "微信支付");(2, "支付宝支付");(3, "银联支付");(4, "现金支付");
669 Amount = (decimal)0.01,
670 Quantity = 1,
671 PayStatus = 0,//支付成功回调更新为1
672 AddTime = DateTime.Now,
673 IsDeleted = false,
674 OrderNo = Str_Out_trade_no,
675 SerialNo = Str_Out_trade_no,
676 OperationNo = req.OperationNo
677 };
678 _payService2.Insert(m2);
679
680 //插入 AgentOperation 表
681 var m3 = new M_AgentOperation()
682 {
683 AgentNo = "bsr_zxj",
684 OperationNo = req.OperationNo,
685 AgentDeviceNo = req.deviceNo,
686 BusinessNo = "dgnzxj",
687 OperationStatus = true,
688 AddTime = DateTime.Now,
689 IsDeleted = false,
690 ValidateCode = "1111",
691 Status = 0 //支付成功回调更新为1
692 };
693 _payService3.Insert(m3);
694
695
696 }
697 private void WritePayDataNew(WxAliPayRequestOnlyUrl req, string Str_Out_trade_no)
698 {
699 WriteLog.Debug("WritePayData begin");
700 if (req == null)
701 return;
702 //
703 var _payService2 = EngineContext.Current.Resolve<IAgentOperationPayService>();
704 var _payService3 = EngineContext.Current.Resolve<IAgentOperationService>();
705
706 //插入 AgentOperationPay 表
707 var m2 = new M_AgentOperationPay()
708 {
709 Payment = 0,//支付成功回调更新为 (1, "微信支付");(2, "支付宝支付");(3, "银联支付");(4, "现金支付");
710 Amount = (decimal)0.01,
711 Quantity = 1,
712 PayStatus = 0,//支付成功回调更新为1
713 AddTime = DateTime.Now,
714 IsDeleted = false,
715 OrderNo = Str_Out_trade_no,
716 SerialNo = Str_Out_trade_no,
717 OperationNo = req.OperationNo
718 };
719 _payService2.Insert(m2);
720
721 //插入 AgentOperation 表
722 var m3 = new M_AgentOperation()
723 {
724 AgentNo = "bsr_zxj",
725 OperationNo = req.OperationNo,
726 AgentDeviceNo = req.deviceNo,
727 BusinessNo = "dgnzxj",
728 OperationStatus = true,
729 AddTime = DateTime.Now,
730 IsDeleted = false,
731 ValidateCode = "1111",
732 Status = 0 //支付成功回调更新为1
733 };
734 _payService3.Insert(m3);
735
736
737 }
738 private void WritePayData2(WxAliPayRequest req, string Str_Out_trade_no)
739 {
740 WriteLog.Debug("WritePayData begin");
741 if (req == null)
742 return;
743 var filePath = Base64_to_File(req.avatar);
744
745 //插入 Agent_User_Img 表
746 var m = new M_Agent_User_Img()
747 {
748 SFZMHM = req.SFZMHM,
749 SFZMMC = req.SFZMMC,
750 SFZMLX = req.SFZMLX,
751 Img_Type = req.Img_Type,
752 Img_Url = filePath,
753 OperationNo = req.OperationNo,
754 Img_Spec = req.Img_Spec,
755 Create_Time = DateTime.Now,
756 IsDeleted = false
757 };
758 _userService.Insert(m);
759
760 //插入 AgentOperationPay 表
761 var m2 = new M_AgentOperationPay()
762 {
763 Payment = 1,
764 Amount = (decimal)0.01,
765 Quantity = 1,
766 PayStatus = 0,
767 AddTime = DateTime.Now,
768 IsDeleted = false,
769 OrderNo = Str_Out_trade_no,
770 SerialNo = Str_Out_trade_no,
771 OperationNo = req.OperationNo
772 };
773 _payService.Insert(m2);
774
775 //插入 AgentOperation 表
776 var m3 = new M_AgentOperation()
777 {
778 AgentNo = "bsr_zxj",
779 OperationNo = req.OperationNo,
780 AgentDeviceNo = req.deviceNo,
781 BusinessNo = "dgnzxj",
782 OperationStatus = true,
783 AddTime = DateTime.Now,
784 IsDeleted = false,
785 ValidateCode = "1111",
786 Status = 1
787 };
788 _operateService.Insert(m3);
789
790
791 }
792
793 private string GetOut_trade_no()
794 {
795 return System.DateTime.Now.ToString("yyyyMMddHHmmss") + GetRandom(10);
796 }
797
798 private string Base64_to_File(string imageCode)
799 {
800 if (string.IsNullOrEmpty(imageCode))
801 return "";
802
803 byte[] arr2 = Convert.FromBase64String(imageCode);
804 using (MemoryStream ms2 = new MemoryStream(arr2))
805 {
806 string dir = "/user_img/" + DateTime.Now.ToString("yyyyMMdd") + "/";
807 if (!Directory.Exists(Server.MapPath(dir)))
808 {
809 Directory.CreateDirectory(Server.MapPath(dir));
810 }
811 string fileName = Guid.NewGuid() + ".jpg";
812 string dirFile = Server.MapPath(dir) + fileName;
813
814 System.Drawing.Bitmap bmp2 = new System.Drawing.Bitmap(ms2);
815 bmp2.Save(dirFile, System.Drawing.Imaging.ImageFormat.Jpeg);
816 //bmp2.Save(filePath + ".bmp", System.Drawing.Imaging.ImageFormat.Bmp);
817 //bmp2.Save(filePath + ".gif", System.Drawing.Imaging.ImageFormat.Gif);
818 //bmp2.Save(filePath + ".png", System.Drawing.Imaging.ImageFormat.Png);
819 return dir + fileName;
820 }
821 }
822
823 //生成N位的随机数 全数字
824 private string GetRandom(int len)
825 {
826 string k = "";
827 Random rand = new Random(GetRandomSeed());
828 for (int i = 0; i < len; i++)
829 {
830 k += rand.Next(0, 10).ToString();
831 }
832 return k;
833 }
834 //取随机数种子
835 private int GetRandomSeed()
836 {
837 byte[] bytes = new byte[4];
838 System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider();
839 rng.GetBytes(bytes);
840 return BitConverter.ToInt32(bytes, 0);
841 }
842 #endregion
843
844 #region 客户端轮询此接口,查是否已经付款
845 //根据订单号来查询
846 [HttpPost]
847 public JsonResult CheckIsPay(string out_trade_no)
848 {
849 var m = _payService.GetByOrderNo(out_trade_no);
850 if (m == null)
851 {
852 return Json(new { code = "0", msg = "未支付" });
853 }
854 else if (m.PayStatus == 1)
855 {
856 return Json(new { code = "1", msg = "已支付" });
857 }
858 else
859 {
860 return Json(new { code = "0", msg = "未支付" });
861 }
862
863 }
864 #endregion
865 }
866 }

支付宝调用需要引用官网的一些dll, 微信的需要添加一些文件:

.net中微信、支付宝回调的更多相关文章

  1. app微信支付宝支付后台的插件模式+回调通过spring广播处理后续业务(已亲测可用)

    写在前面的话:每当我们做一个项目,基本上都会涉及到支付的业务,最常用的莫过于微信和支付宝的支付了,项目有bug,有问题,都不叫问题,可一旦钱出了问题,那就是大问题了,所以在支付业务上我们必须慎之又慎! ...

  2. iOS开发笔记14:微博/微信登录与分享、微信/支付宝支付

    产品中接入了微博/微信的第三方登录分享功能.微信和支付宝的第三方支付功能,之前在开发过程中涉及到这些部分,于是抽空将接入过程梳理了一遍. 1.微博.微信.支付宝SDK相关接入设置 (1)微博SDK S ...

  3. React Native之支付集成(微信 支付宝)(ios android)

    React Native之支付集成(微信 支付宝)(ios android) 一,需求分析 1.1,app在线充值与提现 二,技术介绍与集成 2.1,微信支付 2.1.1,Android配置 详细配置 ...

  4. Swift调用微信支付宝SDK(Swift4.0)

    1.第一步在程序入口注册微信  (支付宝不需要) func application(_ application: UIApplication, didFinishLaunchingWithOption ...

  5. 解决微信授权回调页面域名只能设置一个的问题 [php]

    最终的解决方案是:https://github.com/liuyunzhuge/php_weixin_proxy,详细的介绍请往下阅读. 在做项目集成微信登录以及微信支付的时候,都需要进行用户授权.这 ...

  6. ionic单页面应用中微信分享的问题总结

    首先说一下 ionic 是单页面应用,也就是说整个项目就有一个index.html, 那么问题就就来了, 如果我们不同的页面要分享给大家的是不同的链接和图片,应该怎么去做呢? 这就是我们今天要总结的东 ...

  7. 支付宝回调JAVA版代码

    支付宝回调: 1 //这个是支付宝回调的信息 2 @RequestMapping("alipay_callback.do") 3 @ResponseBody 4 public Ob ...

  8. 微信redirect_uri 回调错误,scope权限错误

    scope权限错误以及微信redirect_uri回调错误 昨天修改项目的时候,初始时,因为项目最开始使用的是第三方授权处理,拿到的用户openid是第三方账号的,所以需要将获取对方信息的代码修改.只 ...

  9. Spring Boot中微信全局token的缓存实现

    为什么要缓存token? 这里的token指的是微信JSAPI中基础支持的ACCESS_TOKEN,并非网页授权ACCESS_TOKEN.网页授权Token每天的调用次数没有限制,不需要缓存. 接口 ...

  10. java实现微信支付宝等多个支付平台合一的二维码支付(maven+spring springmvc mybatis框架)

    首先申明,本人实现微信支付宝等支付平台合多为一的二维码支付,并且实现有效时间内支付有效,本人采用的框架是spring springmvc mybatis 框架,maven管理.其实如果支付,不需要my ...

随机推荐

  1. AD域安装后无法打开网络适配器,提示无法访问指定设备,路径或文件,你可能没有。。。

    虚拟机安装win 2016,配置网络,安装VM tools,激活,重启. 修改计算机名,重启,安装AD域,DNS,重启 然后准备修改DNS指向的时候发现无法打开更改适配器选项. 打开服务器管理器,点击 ...

  2. 【MySQL 服务器参数优化】

    http://www.hainiubl.com/topics/75823 https://www.cnblogs.com/msjhw/p/15816582.html https://blog.csdn ...

  3. Solidity8.0-01

    对应崔棉大师 1-25课程https://www.bilibili.com/video/BV1yS4y1N7yu/?spm_id_from=333.788&vd_source=c81b130b ...

  4. 关于tensor2tensor与tensorflow版本冲突的解决方案

    工作需要,研究了几天的t2t,万万没想到在虚拟环境的搭建方面出现了问题. 直接安装t2t,当前是1.15.7版本,默认会安装tensorflow的最新版本,最终会在执行t2t-trainer命令的时候 ...

  5. redis底层数据结构之简单动态字符串(SDS)

    简单动态字符串(simple dynamic string,SDS) redis使用C语言编写的,但是redis的字符串却不是C语言中的字符串(以空字符'\0'结尾的字符数组),redis定义了一种简 ...

  6. byte最高位

    /** * 将byte转换为一个长度为8的byte数组,数组每个值代表bit */public static byte[] replaceSpace(Byte b){ byte[] array=new ...

  7. Windows下安装和使用Masscan

    http://zone.secevery.com/article/1098 0x00 前言Masscan号称最快的互联网端口扫描器,本文来探测一下Masscan在Windows下的安装和使用.mass ...

  8. java传递参数调用python完成剪切多个视频最终拼接成一个

    需求如题,综合考虑之后我选择python去做视频处理,最终结果也让我非常满意. 我是windows 环境,安装的python3.8和moviepy模块 第一步:安装python3.8 第二步:修改py ...

  9. java-javaSE-异常机制

    java中的异常结构 java 中的所有异常都来自于顶级父类 Throwable,Throwable 有两个子类 Exception 和 Error Error 是 Java 虚拟机无法解决的严重问题 ...

  10. redis-creating server tcp listening socket 127.0.0.1:6379: bind No error

    安装redis,出现如下错误: 解决方法: 步骤1:命令行下输入:redis-cli.exe(注意不是redis-server.exe) 然后输入:shutdown exit 退出后输入.\redis ...