簡介
今天我們就來使用NCF架構對接一下支付寶支付
參考文檔
支付寶支付開發文檔:https://opendocs.alipay.com/open/204
NCF倉庫位址:https://github.com/NeuCharFramework/NCF (要Star哦)
步驟
1.下載下傳NCF
2.建立自己的XNCF子產品
3.引用Nuget包ML.ThirdParty & ML.Common.SDK & AopSdk
4.建立自己的Controller,并建立接口方法
5.建立PaymentService
6.調用代碼傳回資料給前端
7.前端拿資料吊起支付
案例
1.直接到Github上下載下傳NCF的源碼master分支
2.請參考NCF開發文檔中的建立XNCF子產品
3.項目中引入
1 <ItemGroup>
2 <PackageReference Include="ML.Common.SDK" Version="1.0.2.8" />
3 <PackageReference Include="ML.ThirdParty" Version="1.0.2" />
4 </ItemGroup>
4.建立自己的Controller,并建立方法
1 //引用相關命名空間
2 using ML.Common.SDK;
3 using ML.ThirdParty.Wechat;
1 /// <summary>
2 /// 支付寶支付
3 /// </summary>
4 /// <param name="amount">金額</param>
5 /// <param name="userId">使用者Id</param>
6 /// <returns></returns>
7 [HttpPost]
8 public async Task<IActionResult> AliPaymentAsync(string amount,string userId)
9 {
10 try
11 {
12 SenparcTrace.Log($"amount---{amount},userId----{userId}");
13 PaymentService paymentService = new PaymentService();
14 var obj = await paymentService.PaymentParam(amount, userId);
15 return Success(obj);
16 }
17 catch (Exception ex)
18 {
19 return Fail(ex.Message);
20 }
21 }
1 using Senparc.CO2NET.Trace;
2 using Senparc.Ncf.Core.Enums;
3 using Senparc.Ncf.Repository;
4 using Senparc.Ncf.Service;
5 using System;
6 using System.Collections.Generic;
7 using System.Linq;
8 using System.Threading.Tasks;
9 using ML.Xncf.Admin.Models.DatabaseModel;
10 using ML.Xncf.Admin.Models.DatabaseModel.Dto;
11 using Senparc.Ncf.Utility;
12 using Microsoft.EntityFrameworkCore;
13 using System.Text;
14 using ML.Xncf.Admin.Models;
15 using Aop.Api;
16 using Aop.Api.Request;
17 using Aop.Api.Response;
18 using Aop.Api.Util;
19 using Aop.Api.Domain;
20 using System.Web;
21 using ML.Xncf.Admin.Models.DatabaseModel.VO;
22 using ML.Xncf.Admin.Param;
23
24 namespace ML.Xncf.Admin.Services
25 {
26 public class PaymentService
27 {
28 public IAopClient client;
29
30 protected const string strPrivateKey = @"bxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn";
31 protected const string strPublicKey = @"bxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZ";
32
33 public PaymentService()
34 {
35 client = new DefaultAopClient("https://openapi.alipay.com/gateway.do", "9880981436596309", strPrivateKey, "json", "1.0", "RSA2", strPublicKey, "UTF-8", false);
36 }
37
38 /// <summary>
39 /// 支付寶參數
40 /// </summary>
41 /// <returns></returns>
42 public async Task<object> PaymentParam(string amount,string userId)
43 {
44 try
45 {
46 //執行個體化具體API對應的request類,類名稱和接口名稱對應,目前調用接口名稱如:alipay.trade.app.pay
47 AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
48 //SDK已經封裝掉了公共參數,這裡隻需要傳入業務參數。以下方法為sdk的model入參方式(model和biz_content同時存在的情況下取biz_content)。
49 AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
50 model.Body = "購買會員," + userId;
51 string strOutTradeNo = DateTime.Now.ToString("yyyyMMddHHmmss");
52 model.OutTradeNo = strOutTradeNo;
53 model.Subject = "購買會員";
54
55 if (!string.IsNullOrEmpty(amount))
56 {
57 model.TotalAmount = amount;
58 }
59 else
60 {
61 model.TotalAmount = "0.01";
62 }
63 model.ProductCode = "QUICK_MSECURITY_PAY";
64 model.TimeoutExpress = "30m";
65 request.SetBizModel(model);
66 request.SetNotifyUrl("http://www.alibaba.com/api/alipay/notice");
67 //這裡和普通的接口調用不同,使用的是sdkExecute
68 AlipayTradeAppPayResponse response = client.SdkExecute(request);
69 //HttpUtility.HtmlEncode是為了輸出到頁面時防止被浏覽器将關鍵參數html轉義,實際列印到日志以及http傳輸不會有這個問題
70 SenparcTrace.Log($"支付寶支付結果資訊為未轉義-----{response.Body}");
71 SenparcTrace.Log($"支付寶支付結果資訊為-----{HttpUtility.HtmlEncode(response.Body)}");
72 return new BaseResult<object>(200,"請求成功", HttpUtility.HtmlEncode(response.Body).Replace("&", "&"));
73 }
74 catch (Exception ex)
75 {
76 return new BaseResult<object>(201, "請求失敗", ex.Message);
77 }
78 }
79
80 }
81
82 }
6.調用代碼傳回資料(即4中傳回的obj的資料)給前端
結語
按照上面的方法讓你瞬間解決支付寶APP支付的難題,歡迎大家交流,歡迎Star,歡迎關注
QQ:365845726
微信:zhao365845726
有興趣可以加入QQ群:
群号:924439616(ML-Dotnet解決方案)