新版支付宝开放平台 手机网页支付 整个流程

hejisan的专栏

RSS订阅

新版支付宝开放平台 手机网页支付 整个流程

2017年06月29日 18:32:03

阅读数:6926

新版支付宝开放平台  手机网页支付 整个流程

在支付宝签约如下产品

然后,使用支付宝最新的签名工具生成商户的私钥和公钥

值得注意的是,如果是.net c# 请选择PKCS1,我只采用1024密钥长度。

然后来到支付宝的账号管理中心:

在如图的开放平台密钥页所示处,将上述软件生成的商户公钥设置到应用公钥处,然后设置授权回调地址,设置完后,点开查看并保存支付宝公钥,用于加密及验签。

基它地方不要设置,不要动。

下载最新的.net 支付宝SDK,引入工程

然后,在自己工程中配置支付宝参数 :

发起支付:

 

[csharp] view plain copy

print?

  1. <code class="language-csharp">IAopClient client = new DefaultAopClient(AlipayConfig.Alipay_Server, AlipayConfig.APPID, AlipayConfig.APP_PRIVATE_KEY, "json", "1.0", "RSA", AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, false);  
  2. AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();  
  3. request.SetNotifyUrl(AlipayConfig.Asynchronous_Notice_Location_Alipay);  
  4. request.SetReturnUrl(AlipayConfig.Synchronous_Notice_Location_Alipay);  
  5. string desc = "商城充值";  
  6. string subject = "hahahaha";  
  7. string out_trade_no = payDetail.Id.ToString();  
  8. string total_amount = payDetail.Price.ToString("F2");  
  9. request.BizContent = "{" +  
  10. "    \"body\":\" " + desc + "\"," +  
  11. "    \"subject\":\"" + subject + "\"," +  
  12. "    \"out_trade_no\":\"" + out_trade_no + "\"," +  
  13. "    \"timeout_express\":\"90m\"," +  
  14. "    \"total_amount\":+"+ total_amount + "," +  
  15. "    \"product_code\":\"QUICK_WAP_WAY\"" +  
  16. "  }";  
  17. AlipayTradeWapPayResponse response = client.pageExecute(request);  
  18. string form = response.Body;  
  19. form = form.Replace("<script>document.forms['alipaysubmit'].submit();</script>", "");  
  20. form = form.Replace("<form id='alipaysubmit' name='alipaysubmit' action='https://openapi.alipay.com/gateway.do?charset=UTF-8' method='POST'>",   
  21.     "<form id='alipaysubmit' name='alipaysubmit' action='https://openapi.alipay.com/gateway.do?charset=UTF-8' method='POST' style='display:none;'>");  
  22. ViewBag.Content = form;</code>  
 
  1. IAopClient client = new DefaultAopClient(AlipayConfig.Alipay_Server, AlipayConfig.APPID, AlipayConfig.APP_PRIVATE_KEY, "json", "1.0", "RSA", AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, false);

  2. AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();

  3. request.SetNotifyUrl(AlipayConfig.Asynchronous_Notice_Location_Alipay);

  4. request.SetReturnUrl(AlipayConfig.Synchronous_Notice_Location_Alipay);

  5. string desc = "商城充值";

  6. string subject = "hahahaha";

  7. string out_trade_no = payDetail.Id.ToString();

  8. string total_amount = payDetail.Price.ToString("F2");

  9. request.BizContent = "{" +

  10. " \"body\":\" " + desc + "\"," +

  11. " \"subject\":\"" + subject + "\"," +

  12. " \"out_trade_no\":\"" + out_trade_no + "\"," +

  13. " \"timeout_express\":\"90m\"," +

  14. " \"total_amount\":+"+ total_amount + "," +

  15. " \"product_code\":\"QUICK_WAP_WAY\"" +

  16. " }";

  17. AlipayTradeWapPayResponse response = client.pageExecute(request);

  18. string form = response.Body;

  19. form = form.Replace("<script>document.forms['alipaysubmit'].submit();</script>", "");

  20. form = form.Replace("<form id='alipaysubmit' name='alipaysubmit' action='https://openapi.alipay.com/gateway.do?charset=UTF-8' method='POST'>",

  21. "<form id='alipaysubmit' name='alipaysubmit' action='https://openapi.alipay.com/gateway.do?charset=UTF-8' method='POST' style='display:none;'>");

  22. ViewBag.Content = form;


 

 
 

然后在页面上调用表单提交:

 
  1. function check() {

  2. var ua = window.navigator.userAgent.toLowerCase();

  3. if (ua.match(/MicroMessenger/i) == 'micromessenger') {

  4. alert('请点击右上角菜单,在浏览器中打开本页面完成支付。');

  5. } else {

  6.  
  7. document.forms['alipaysubmit'].submit();

  8.  
  9. }

  10. }


然后,异步通知页验签:

 
  1. public Dictionary<string, string> GetRequestPost(HttpRequestBase request)

  2. {

  3. int i = 0;

  4. Dictionary<string, string> sArray = new Dictionary<string, string>();

  5. System.Collections.Specialized.NameValueCollection coll;

  6. coll = request.Form;

  7. String[] requestItem = coll.AllKeys;

  8. for (i = 0; i < requestItem.Length; i++)

  9. {

  10. sArray.Add(requestItem[i], request.Form[requestItem[i]]);

  11. }

  12. return sArray;

  13. }

 
  1. try

  2. {

  3. bool flag = Aop.Api.Util.AlipaySignature.RSACheckV1(GetRequestPost(Request), AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, "RSA", false);

  4. if(flag)

  5. {

  6. log4net.LogManager.GetLogger("root").Info("支付宝签名验证成功");

  7. //1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,

  8. //2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),

  9. //3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email),

  10. //4、验证app_id是否为该商户本身。上述1、2、3、4有任何一个验证不通过,则表明本次通知是异常通知,务必忽略。

  11. //在上述验证通过后商户必须根据支付宝不同类型的业务通知,正确的进行不同的业务处理,并且过滤重复的通知结果数据。

  12. //在支付宝的业务通知中,只有交易通知状态为TRADE_SUCCESS或TRADE_FINISHED时,支付宝才会认定为买家付款成功。

  13.  
  14. //商户订单号

  15. string out_trade_no = Request.Form["out_trade_no"] ;

  16. log4net.LogManager.GetLogger("root").Info("商户订单号" + out_trade_no);

  17.  
  18. string app_id = Request.Form["app_id"];

  19. log4net.LogManager.GetLogger("root").Info("app_id:" + app_id);

  20. if (app_id != AlipayConfig.APPID)

  21. {

  22. log4net.LogManager.GetLogger("root").Info("app_id != AlipayConfig.APPID" );

  23. return Content("fail");

  24. }

  25. string trade_no = Request.Form["trade_no"] ;

  26. log4net.LogManager.GetLogger("root").Info("支付宝交易号" + trade_no);

  27.  
  28. //交易状态

  29. string trade_status = Request.Form["trade_status"] ;

  30. log4net.LogManager.GetLogger("root").Info("交易状态" + trade_status);

  31.  
  32. string gmt_payment= Request.Form["gmt_payment"] ;

  33. log4net.LogManager.GetLogger("root").Info("交易支付时间:" + gmt_payment);

  34.  
  35. string total_amount= Request.Form["total_amount"] ;

  36. log4net.LogManager.GetLogger("root").Info("交易金额:" + total_amount);

  37. decimal money=total_amount.ParseTo<decimal>(0);

  38.  
  39. if (Request.Form["trade_status"] == "TRADE_FINISHED" || Request.Form["trade_status"] == "TRADE_SUCCESS")

  40. {

  41. DealPay_Alipay(out_trade_no, trade_no, gmt_payment, money);

  42. return Content("success");

  43. }

  44. else

  45. {

  46. return Content("fail");

  47. }

  48. //——请根据您的业务逻辑来编写程序(以上代码仅作参考)——

  49. }

  50. }

  51. catch (CustomerException ex)

  52. {

  53. log4net.LogManager.GetLogger("root").Info("ex:" + ex.Message);

  54. return Content("fail");

  55. }

  56. catch (Exception ex)

  57. {

  58. log4net.LogManager.GetLogger("root").Info("ex:" + ex.Message + ex.InnerException.Message + ex.StackTrace);

  59. return Content("fail");

  60. }

  61. return Content("fail");



同步通知页:

 
  1. if (!String.IsNullOrEmpty(Request.Form["trade_no"]) || !String.IsNullOrEmpty(Request.QueryString["trade_no"]))

  2. {

  3. return View();

  4. }

  5. else

  6. {

  7. return RedirectToAction("AlipayFail");

  8. }

猜你喜欢

转载自blog.csdn.net/Andrewniu/article/details/81457185