C#实现Stripe支付的方法实践
作者:新鑫S 发布时间:2023-01-22 01:46:47
标签:C#,Stripe,支付
Stripe支付首页需要引用Stripe.net框架,我引用的是22.8.0版本,注意.NETFramework的版本为4.5,同时需要引用Newtonsoft.Json(版本不能低于9.0.1)和System.Collections.Immutable(版本不低于1.5.0)。
一、前端JS代码如下:
<script src="https://js.stripe.com/v3/"></script>
<script src="https://checkout.stripe.com/checkout.js"></script>
<script type="text/javascript">
//Stripe支付
var myStripe = {
testKey: '<%=ConfigurationManager.AppSettings["pk_liveConfig"] %>', //配置文件中的key 这个从Stripe中取,我就不截图展示了
logoImg: "https://stripe.com/img/documentation/checkout/marketplace.png", //抬头的Logo
//换卡
changeHandler: function (f) {
return StripeButton.configure({
key: this.testKey,
image: f.logoImg || this.logoImg,
name: f.title || 'Update Card Detail',
panelLabel: f.button || 'Submit',
allowRememberMe: false,
locale: 'auto',
dataKey: this.testKey,
token: function (token) {
f.email = token.email;
f.tokenId = token.id;
f.callback(f);
}
});
},
payHandler: function (f) {
layer.closeAll(0);
return StripeCheckout.configure({
key: this.testKey,
name: f.title || 'Stripe费用',
email: f.Email || '',
currency: f.currency || 'zxx',
amount: f.amount || 0,
allowRememberMe: false,
image: f.logoImg || this.logoImg,
locale: 'auto',
token: function (token) {
f.tokenId = token.id;
f.email = token.email;
f.callback(f);
}
});
},
changeCard: function (f) {
this.changeHandler(f).open();
},
pay: function (f) {
this.payHandler(f).open();
},
SendMsg: function (uid) {
var message = {};
message.action = "noticeMember";
message.code = 1;
message.uid = uid;
message.msg = "<div>已有用户购买了该照片!</div>";
socketApi.sendMessage(message);
}
}
myStripe.pay({
title: 'TEST',
currency: 'USD',//币种:美元(USD)、人民币(CNY)、港币(HKD)
amount: <%=Convert.ToInt32(acoumt) %> * 100,//金额
callback: function (p) {
$.ajax({
type: 'POST',
dataType: 'text',
url: '/admin/ajax/PCBAOrdersData.ashx',
data: 'param=Pay&email=' + this.email + "&amount=" + this.amount + "&tokenId=" + this.tokenId,
success: function (data) {
if (data == "succeeded") {
location.href = "";//支付成功,跳转页面
} else {
layer.msg(data);
}
},
error: function () {
}
})
}
});
</script>
效果如图所示:
二、后端C#代码如下:
/// <summary>
/// Stripe支付
/// </summary>
public void Pay()
{
string Msg = "Payment Failure";
try
{
string tokenId = _Request.GetString("tokenId", "");
string amount = _Request.GetString("amount", "0");
string email = _Request.GetString("email", "");
Stripe.StripeConfiguration.SetApiKey(ConfigurationManager.AppSettings["pk_liveSecretKey"]);
var options = new Stripe.ChargeCreateOptions
{
Amount = Convert.ToInt64(amount),
Currency = "USD",//币种:美元(USD)、人民币(CNY)、港币(HKD)
SourceId = tokenId,
Description = "Stripe支付",//说明
ReceiptEmail = email,
};
var service = new Stripe.ChargeService();
Stripe.Charge charge = service.Create(options);
Msg = charge.Status;
}
catch (Exception e)
{
Msg = e.Message;
throw e;
}
finally
{
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.Write(Msg);
HttpContext.Current.Response.End();
}
}
三、配置文件代码如下:
<appSettings>
<add key="pk_liveConfig" value="pk_test_XXXXXX"/><!--stripe账号公钥-->
<add key="pk_liveSecretKey" value="sk_test_XXXXXX"/><!--stripe账号Secret key-->
</appSettings>
Stripe支付的流程就是点击支付按钮就调用myStripe.pay函数去生成token,然后调用callback方法执行后台代码,返回succeeded就是支付成功了
来源:https://blog.csdn.net/weixin_44547599/article/details/122886515
0
投稿
猜你喜欢
- 这里使用的是dynamic-datasource-spring-boot-starter ,它是一个基于springboot的快速集成多数据
- 这篇文章主要介绍了spring cloud gateway请求跨域问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定
- 前言上一篇 文章我们完成了在 thymeleaf 模板引擎中使用 shiro 标签,也就是根据不同的用户身份信息,前端页面来显示不同的页面内
- 介绍跨域CORS,全称是"跨域资源共享"(Cross-origin resource sharing)当页面发出跨域请求
- java -version 命令大家都用过,大部分就是看下jdk版本或检查下环境变量的设置,但最后一行的信息也挺重要,如下图所示:Serve
- 前言本文介绍在spring mvc中非常重要的注解@ModelAttribute.这个注解可以用在方法参数上,或是方法声明上。这个注解的主要
- Android中有两种主要方式使用Service,通过调用Context的startService方法或调用Context的bindServ
- spring-AOP 及 AOP获取request各项参数AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事
- 1. 调试追踪代码: public static void enterTryMethod() { S
- java 同步、异步、阻塞和非阻塞分析概要:正常情况下,我们的程序以同步非阻塞的方式在运行。但是我们的程序总会出现一些耗时操作,比如复杂的计
- 今天写程序的时候用到了附加属性,我是用VS内置的propa的代码段来实现的,代码如下:class Attach {
- 前言由于现在网络层已经升级到RxJava2.x相关的了,所以需要做些调整。虽然RxJava1.x和RxJava2.x同属RxJava系列,但
- 需求是需要在TextView前端加入一个标签展示。最终效果图如下:根据效果图,很容易就能想到使用SpannableStringBuilder
- 上篇文章我们已经可以在 Grafana 上看到对应的 SpringBoot 应用信息了,通过这些信息我们可以对 SpringBoot 应用有
- jar包就指第三方提供的开源的API,这些API不属于JDK的,需要通过导入才能使用。添加和导入的区别注意:本文里的 导入 和 添加 jar
- 一 点睛注解若想发挥更大作用,还需借助反射机制之力。通过反射,可以取得一个方法上声明的注解的全部内容。一般有两种需求:1 
- 一、Filter(过滤器)Filter接口定义在javax.servlet包中,是Servlet规范定义的,作用于Request/Respo
- 注入集合(数组、List、Map、Set)类型属性(1)创建类,定义数组,list,map,set类型属性,并且生成对应的set方法。(2)
- 前言:在没有接触java8的时候,我们遍历一个集合都是用循环的方式,从第一条数据遍历到最后一条数据,现在思考一个问题,为什么要使用循环,因为
- 鼠标事件监听机制的三个方面:1.事件源对象:事件源对象就是能够产生动作的对象。在Java语言中所有的容器组件和元素组件都是事件监听中的事件源