天天看點

NCF 如何寫支付寶支付中的APP支付

簡介

今天我們就來使用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("&amp;", "&"));
73             }
74             catch (Exception ex)
75             {
76                 return new BaseResult<object>(201, "請求失敗", ex.Message);
77             }
78         }
79 
80     }
81 
82 }      

6.調用代碼傳回資料(即4中傳回的obj的資料)給前端

NCF 如何寫支付寶支付中的APP支付
NCF 如何寫支付寶支付中的APP支付
NCF 如何寫支付寶支付中的APP支付

結語

 按照上面的方法讓你瞬間解決支付寶APP支付的難題,歡迎大家交流,歡迎Star,歡迎關注

QQ:365845726

微信:zhao365845726

有興趣可以加入QQ群:

群号:924439616(ML-Dotnet解決方案)

繼續閱讀