NCF 如何对接三方的功能(五)
- 2021 年 12 月 13 日
本文字数:5644 字
阅读完需:约 19 分钟

概述
后台的功能中除了增删改查,webapi,之外还有什么功能是必要的呢,那就是对接三方的功能,比如微信支付,支付宝支付,短信等,这里我来说一下 NCF 是如何对接这些三方的
微信的 APP 支付对接
参考文档
微信支付 V2 开发文档:https://pay.weixin.qq.com/wiki/doc/api/index.html
NCF 仓库地址:https://github.com/NeuCharFramework/NCF (要 Star 哦)
步骤
1.下载 NCF
2.创建自己的 XNCF 模块
3.引用 Nuget 包 ML.ThirdParty & ML.Common.SDK
<ItemGroup> <PackageReference Include="ML.Common.SDK" Version="1.0.2.8" /> <PackageReference Include="ML.ThirdParty" Version="1.0.2" /> </ItemGroup>4.建立自己的 Controller,并创建接口方法
//引用相关命名空间using ML.Common.SDK;using ML.ThirdParty.Wechat;/// <summary> /// 微信支付 /// </summary> /// <param name="openId">用户的微信OpenId</param> /// <param name="userId">用户Id</param> /// <param name="body">内容</param> /// <param name="totalFee">支付的总金额</param> /// <returns></returns> [HttpPost] public async Task<IActionResult> WxPayAsync(string openId,string userId,string body, int totalFee) { try { //ML 方案 WechatPayHelper wxpay = new WechatPayHelper(); WechatPaymentParam wxpayParam = new WechatPaymentParam(); wxpayParam.appid = "wx2y***********uix6"; wxpayParam.mch_id = "016*****78"; wxpayParam.attach = $"userId={userId};totalFee={totalFee.ToString()}"; wxpayParam.body = body; wxpayParam.total_fee = totalFee.ToString(); wxpayParam.notify_url = "https://www.weixin.com/api/v1/payment/wxNotifyUrl"; wxpayParam.trade_type = "APP"; wxpayParam.openid = openId; string strOutTradeNo = ""; var result = wxpay.Payment(wxpayParam, "5hJpKkSa******************LTu9kP", out strOutTradeNo); SenparcTrace.Log($"result----{result},sign={strOutTradeNo}"); result = result.Replace("<![CDATA[", "").Replace("]]>", "").Replace("\n", ""); DataTable dtWxPayResponse = XMLHelper.XMLToDataTable(result); var response = dtWxPayResponse.ToJson().Replace("}]", $",\"timestamp\":\"{DateTimeHelper.ConvertToJavaScriptUnix(DateTime.Now)}\"}}]");
MakeCallPaymentParam mcpp = new MakeCallPaymentParam(); mcpp.appid = "wx2y**********duix6"; mcpp.partnerid = "01******78"; mcpp.prepayid = dtWxPayResponse.Rows[0]["prepay_id"].ToString(); mcpp.package = "Sign=WXPay"; mcpp.noncestr = ""; mcpp.timestamp = ""; string strSign = ""; var data = wxpay.MakeCallPayment(mcpp, "5hJpK********************u9kP", out strSign); string rp = XMLHelper.XMLToDataTable(WechatPayHelper.FormatParamToXML(data)).ToJson(); return Success(rp); } catch (Exception ex) { return Fail(ex.Message); } }5.调用代码返回数据给前端
6.前端拿数据吊起支付
支付宝的 APP 支付对接
参考文档
支付宝支付开发文档:https://opendocs.alipay.com/open/204
步骤
1.下载 NCF
2.创建自己的 XNCF 模块
3.引用 Nuget 包 ML.ThirdParty & ML.Common.SDK & AopSdk
<ItemGroup> <PackageReference Include="ML.Common.SDK" Version="1.0.2.8" /> <PackageReference Include="ML.ThirdParty" Version="1.0.2" /> </ItemGroup>4.建立自己的 Controller,并创建接口方法
//引用相关命名空间 using ML.Common.SDK; using ML.ThirdParty.Wechat;/// <summary>/// 支付宝支付/// </summary>/// <param name="amount">金额</param>/// <param name="userId">用户Id</param>/// <returns></returns>[HttpPost]public async Task<IActionResult> AliPaymentAsync(string amount,string userId){ try { SenparcTrace.Log($"amount---{amount},userId----{userId}"); PaymentService paymentService = new PaymentService(); var obj = await paymentService.PaymentParam(amount, userId); return Success(obj); } catch (Exception ex) { return Fail(ex.Message); }}5.建立 PaymentService
using Senparc.CO2NET.Trace;using Senparc.Ncf.Core.Enums;using Senparc.Ncf.Repository;using Senparc.Ncf.Service;using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using ML.Xncf.Admin.Models.DatabaseModel;using ML.Xncf.Admin.Models.DatabaseModel.Dto;using Senparc.Ncf.Utility;using Microsoft.EntityFrameworkCore;using System.Text;using ML.Xncf.Admin.Models;using Aop.Api;using Aop.Api.Request;using Aop.Api.Response;using Aop.Api.Util;using Aop.Api.Domain;using System.Web;using ML.Xncf.Admin.Models.DatabaseModel.VO;using ML.Xncf.Admin.Param;
namespace ML.Xncf.Admin.Services{ public class PaymentService { public IAopClient client;
protected const string strPrivateKey = @"bxOYPgAy**********************3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn"; protected const string strPublicKey = @"bxOYPgAy**********************3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZbxOYPgAyIlE94ofz9v75nM20VM5cacea3hRb4q2qVCuw6p3tJkXwmRLn1zrGvCvZ";
public PaymentService() { client = new DefaultAopClient("https://openapi.alipay.com/gateway.do", "9880***************309", strPrivateKey, "json", "1.0", "RSA2", strPublicKey, "UTF-8", false); }
/// <summary> /// 支付宝参数 /// </summary> /// <returns></returns> public async Task<object> PaymentParam(string amount,string userId) { try { //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称如:alipay.trade.app.pay AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest(); //SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。 AlipayTradeAppPayModel model = new AlipayTradeAppPayModel(); model.Body = "购买会员," + userId; string strOutTradeNo = DateTime.Now.ToString("yyyyMMddHHmmss"); model.OutTradeNo = strOutTradeNo; model.Subject = "购买会员";
if (!string.IsNullOrEmpty(amount)) { model.TotalAmount = amount; } else { model.TotalAmount = "0.01"; } model.ProductCode = "QUICK_MSECURITY_PAY"; model.TimeoutExpress = "30m"; request.SetBizModel(model); request.SetNotifyUrl("http://www.alibaba.com/api/alipay/notice"); //这里和普通的接口调用不同,使用的是sdkExecute AlipayTradeAppPayResponse response = client.SdkExecute(request); //HttpUtility.HtmlEncode是为了输出到页面时防止被浏览器将关键参数html转义,实际打印到日志以及http传输不会有这个问题 SenparcTrace.Log($"支付宝支付结果信息为未转义-----{response.Body}"); SenparcTrace.Log($"支付宝支付结果信息为-----{HttpUtility.HtmlEncode(response.Body)}"); return new BaseResult<object>(200,"请求成功", HttpUtility.HtmlEncode(response.Body).Replace("&", "&")); } catch (Exception ex) { return new BaseResult<object>(201, "请求失败", ex.Message); } }
}
}6.调用代码返回数据给前端
7.前端拿数据吊起支付
阿里云短信对接
参考文档
开发文档:https://help.aliyun.com/document_detail/101414.html?spm=a2c4g.11186623.6.628.53d14fe8pYm0tR
步骤
1.下载 NCF
2.创建自己的 XNCF 模块
3.引用 Nuget 包 AlibabaCloud.SDK.Dysmsapi20170525
<ItemGroup> <PackageReference Include="AlibabaCloud.SDK.Dysmsapi20170525" Version="1.0.2" /> </ItemGroup>4.建立自己的 Controller,并创建方法,调用发送短信方法
/// <summary> /// 发送短信验证码 /// </summary> /// <param name="mobile">手机号</param> /// <returns></returns> [HttpGet] public async Task<IActionResult> SendSMS(string mobile) { try { var response = await ApiSendCodeAsync(mobile); return Success(response); } catch (Exception ex) { return Fail(ex.Message); } }5.建立调用短信的类,创建发送短信方法
using AlibabaCloud.SDK.Dysmsapi20170525; using AlibabaCloud.SDK.Dysmsapi20170525.Models; using AlibabaCloud.OpenApiClient.Models;public async Task<object> ApiSendCodeAsync(string mobile){ Random random = new Random(); string strCode = random.Next(100000, 999999).ToString(); string strTemplateCode = "SMS_000000000"; string accessKeyId = "LTAI*********LB4"; string accessKeySecret = "vp**************************BW"; Config config = new Config { // 您的AccessKey ID AccessKeyId = accessKeyId, // 您的AccessKey Secret AccessKeySecret = accessKeySecret, }; // 访问的域名 config.Endpoint = "dysmsapi.aliyuncs.com"; Client client = new Client(config); SendSmsRequest sendSmsRequest = new SendSmsRequest { PhoneNumbers = mobile, SignName = "米立科技", TemplateCode = strTemplateCode, TemplateParam = $"{{\"code\":\"{strCode}\"}}", }; // 复制代码运行请自行打印 API 的返回值 var smsResponse = client.SendSms(sendSmsRequest); // 将验证码写入Redis SenparcRedis.Set($"VerificationCode:{mobile}", strCode, 300); return strCode;}版权声明: 本文为 InfoQ 作者【MartyZane】的原创文章。
原文链接:【http://xie.infoq.cn/article/81056fc45078afffddcc0fc2c】。文章转载请联系作者。
MartyZane
坚持不懈,直到成功 2021.03.15 加入
技术痴一枚,资深开发,喜欢交流,热爱开源,希望能与更多优秀的开发者一共为社会的进步贡献一份自己的力量











评论