H5网站接入支付宝的支付接口
写本文章的目的是为了记录工作中遇到的问题,方便以后遇到可以迅速解决问题
H5手机网站接入支付宝的支付接口,推荐使用支付宝提供的SDK来快速开发
我使用的是SDK开发
引用命名空间
using Aop.Api;
using Aop.Api.Request;
using Aop.Api.Response;
using Aop.Api.Util;
首页需要定义一些常量

static string serverUrl = "https://openapi.alipaydev.com/gateway.do";
static string app_id = "**"; //开发者的应用ID
static string format = "JSON";
static string charset = "utf-8";
static string sign_type = "RSA2"; //签名格式
static string version = "1.0";
string UID = "2088102169707816";//卖家支付宝账户号
//商户私钥
static string merchant_private_key = "***";
//支付宝公钥
static string alipay_public_key = "***";

这里的app_id,merchant_private_key,alipay_public_key 我就没有列出来了,获取的方法需要自己去支付宝平台完成一些操作进行获取
在用户点击网站付款时,我们需要唤醒支付宝,来进行支付

public string H5RequestPayWay(OrderPO order)
{
IAopClient client = new DefaultAopClient(serverUrl, app_id, merchant_private_key, format, version, sign_type, alipay_public_key, charset, false);
AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();
string address= "http://m." + PathLogic1.RootDomain;
request.SetReturnUrl(address+ "/WebPay/AlipayPayResult");//同步请求
request.SetNotifyUrl(address + "/WebPay/AsyncPay");//异步请求
var lstDetail = Context.Data.OrderDetail.Where(x => x.OrderNo == order.OrderNo).ToSelectList(x=>new { x.SkuName});
StringBuilder sb = new StringBuilder();
for (int i = 0; i < lstDetail.Count(); i++)
{
sb.Append(lstDetail[i].SkuName + ",");
}
request.BizContent = "{" +
"\"body\":\""+sb.ToString().Substring(0,sb.Length-1)+"\"," +
"\"subject\":\"袋鼠巴巴商品支付\"," +
"\"out_trade_no\":\""+order.OrderNo+"\"," +
"\"timeout_express\":\"90m\"," +
"\"total_amount\":"+(order.TotalAmount.Value+order.TotalFreight.Value)+"," +
"\"product_code\":\"QUICK_WAP_PAY\"" +
" }";//这里填写一些发送给支付宝的一些参数 AlipayTradeWapPayResponse response = client.pageExecute(request);
return response.Body;//这里会发送一个表单输出到页面中
}

具体发送给支付宝的参数,自行去查看
执行上面方法后,买家输入自己的支付宝账号密码进行支付,支付成功的结果,支付宝会以post的方式异步请求你的SetNotifyUrl的地址
这个SetNotifyUrl的地址必须要外网可以访问,支付宝的请求才能进来
买家支付成功,商家修改订单状态和数据库的操作,都在异步请求中执行
同步请求
public ActionResult AlipayPayResult()
{
ViewBag.result = "success";
return View("PayResult");
}

/// <summary>
/// 验证通知数据的正确性
/// </summary>
/// <param name="out_trade_no"></param>
/// <param name="total_amount"></param>
/// <param name="seller_id"></param>
/// <returns></returns>
private SortedDictionary<string, string> GetRequestPost()
{
int i = 0;
SortedDictionary<string, string> sArray = new SortedDictionary<string, string>();
NameValueCollection coll;
//Load Form variables into NameValueCollection variable.
coll = Request.Form; // Get names of all forms into a string array.
String[] requestItem = coll.AllKeys; for (i = 0; i < requestItem.Length; i++)
{
sArray.Add(requestItem[i], Request.Form[requestItem[i]]);
} return sArray;
}


/// <summary>
/// 验签
/// </summary>
/// <param name="inputPara"></param>
/// <returns></returns>
public Boolean Verify(SortedDictionary<string, string> inputPara)
{
Dictionary<string, string> sPara = new Dictionary<string, string>();
Boolean verifyResult = AlipaySignature.RSACheckV1(inputPara, alipay_public_key, charset,sign_type,false);
return verifyResult;
}

异步请求:

[HttpPost]
public void AsyncPay()
{
SortedDictionary<string, string> sPara = GetRequestPost();//将post请求过来的参数传化为SortedDictionary
if (sPara.Count > 0)
{
AlipayTradeWayPayServer pay = new AlipayTradeWayPayServer();
Boolean VerifyResult = pay.Verify(sPara);//验签if (VerifyResult)
{
try
{
//商户订单号
string out_trade_no = Request.Form["out_trade_no"];
//支付宝交易号
string trade_no = Request.Form["trade_no"];
//支付金额
decimal total_amount = Request.Form["total_amount"].ConvertType(Decimal.Zero);
//实收金额
//decimal receipt_amount = Request.Form["receipt_amount"].ConvertType(Decimal.Zero);
//交易状态
string trade_status = Request.Form["trade_status"];
//卖家支付宝账号
string seller_id = Request.Form["seller_id"]; //商品描述
string body = Request.Form["body"];
//交易创建时间
DateTime gmt_create = DateTime.Parse(Request.Form["gmt_create"]);
//交易付款时间
DateTime gmt_payment = DateTime.Parse(Request.Form["gmt_payment"]);
string appid = Request.Form["app_id"];
WriteError("验证参数开始");
Boolean DataValidity = pay.CheckInform(out_trade_no, total_amount, seller_id, appid);//商家判断参数时候是否匹配if (DataValidity)
{
if (Request.Form["trade_status"] == "TRADE_FINISHED")
{
AlipayWayPayPO model = CreateAlipayWayPay(out_trade_no, trade_no, trade_status, gmt_create, gmt_payment);
pay.PaySuccess(out_trade_no, model);//修改订单
//注意:
//退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
}
else if (Request.Form["trade_status"] == "TRADE_SUCCESS")
{
AlipayWayPayPO model = CreateAlipayWayPay(out_trade_no, trade_no, trade_status, gmt_create, gmt_payment);
pay.PaySuccess(out_trade_no, model);//修改订单
//注意:
//付款完成后,支付宝系统发送该交易状态通知
}
else
{ } //——请根据您的业务逻辑来编写程序(以上代码仅作参考)—— Response.Write("success"); //请不要修改或删除 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
}
}
catch (Exception ex)
{ }
}
else//验证失败
{
Response.Write("fail");
}
}
else
{
Response.Write("无通知参数");
}
}

H5网站接入支付宝的支付接口的更多相关文章
- 支付宝WAP支付接口开发(Node/Coffee语言)
此博客不更新很久了, 更新的文档在这, 有兴趣到这里围观: http://neutra.github.io/2013/%E6%94%AF%E4%BB%98%E5%AE%9DWAP%E6%94%AF%E ...
- php支付宝在线支付接口开发教程【转】
php支付宝在线支付接口开发教程 这篇文章主要为大家详细介绍了php支付宝在线支付接口开发教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 1.什么是第三方支付 所谓第三方支付,就是一些和各 ...
- 支付宝WAP支付接口开发
支付宝WAP支付接口开发 因项目需要,要增加支付宝手机网站支付功能,找了支付宝的样例代码和接口说明,折腾两天搞定,谨以此文作为这两天摸索的总结.由于公司有自己的支付接口,并不直接使用这个接口,所以晚些 ...
- 【转】支付宝WAP支付接口开发
支付宝WAP支付接口开发 因项目需要,要增加支付宝手机网站支付功能,找了支付宝的样例代码和接口说明,折腾两天搞定,谨以此文作为这两天摸索的总结.由于公司有自己的支付接口,并不直接使用这个接口,所以晚些 ...
- 支付宝php支付接口说明
直接把该代码放到PHP服务器下,直接访问index.php.1.文件列表: alipay_config.php (基本参数配置页面,填写商家的支付宝安全校验码,合作id,支付宝帐号等内容)ind ...
- Django对接支付宝Alipay支付接口
最新博客更新见我的个人主页: https://xzajyjs.cn 我们在使用Django构建网站时常需要对接第三方支付平台的支付接口,这里就以支付宝为例(其他平台大同小异),使用支付宝开放平台的沙箱 ...
- 别无分号只此一家,Python3接入支付宝身份认证接口( alipay.user.certify)体系(2021年最新攻略)
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_184 目前国内身份认证体系做的比较不错的大抵就是支付宝和微信两家了,支付宝的身份验证基于支付宝app的实人认证能力,采用多因子认证 ...
- phpt5支付宝登陆支付接口解析
先看效果图 下面的源码来源网络,自己对照修改. 放入一个插件库中,方便管理 创建支付类 1.发起支付 public function init() { $order_id = $_REQUEST['o ...
- H5 网站支付宝支付(前端部分)包含微信浏览器中的处理方法。
手机网站唤起支付宝支付: H5 网站实现支付宝支付是一个很常见的需求: 实现方式主要是在后台配置和预支付, 前端需要做的就是唤起 支付宝App 然后就可以输入密码支付. 这个其实难度很低, 主要就是在 ...
随机推荐
- Java List<String> list=new ArrayList<String>();为什么要声明为List,而不是ArrayList<String>
例如:代码List list = new ArrayList(); 下面通过list来操作集合.假如代码编写后却发现集合使用的不准确,应该使用LinkedList,那么只要修改一行代码List lis ...
- 【技术分享】linux各种一句话反弹shell总结——攻击者指定服务端,受害者主机(无公网IP)主动连接攻击者的服务端程序(CC server),开启一个shell交互,就叫反弹shell。
反弹shell背景: 想要搞清楚这个问题,首先要搞清楚什么是反弹,为什么要反弹.假设我们攻击了一台机器,打开了该机器的一个端口,攻击者在自己的机器去连接目标机器(目标ip:目标机器端口),这是比较常规 ...
- 基于h5+的微信分享,hbuilder打包
1.打开app项目的manifest.json的文件,选择模块权限配置,将Share(分享)模块添加至已选模块中 2.选择SDK配置,在plus.share·分享中,勾选□ 微信消息及朋友圈,配置好a ...
- DTCMS
DTCMS数据表: http://www.cnblogs.com/hifor/p/4560882.html DTCMS系统框架: http://www.cnblogs.com/hifor/p/4561 ...
- 配置jdk和环境变量
1.官网下载jdk1.8,默认安装即可 2.JAVE_HOME:jdk安装目录 path:C:;%JAVA_HOME%\bin; C:;%JAVA_HONE%\jre\bin;(当dos界面输入命令 ...
- Idea导入maven项目
1.idea中有项目的关闭项目 File>>close project 回到截图 下一步>下一步
- C++面向对象程序设计第三章习题答案解析
整理一下自己写的作业,供考试前复习用,哈哈 进入正题!!! 题目: 2.分析下面的程序,写出其运行时的输出结果 这里就不展示课本源代码,直接给出修改后的代码,错误部分代码已给出具体的注释 #inclu ...
- WinDbg常用命令系列---查看线程调用栈命令K*简介
Windbg里的K*命令显示给定线程的堆栈帧以及相关信息,对于我们调试时,进行调用栈回溯有很大的帮助. 一.K*命令使用方式 在不同平台上,K*命令的使用组合如下 User-Mode, x86 Pro ...
- yum和apt-get 软件包管理器的用法及区别
yum( Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器. 一般来说著名的linux系统基本上分两大类: 1.R ...
- biplot双标图
biplot 双标图 在页面中全部崩溃 句法 biplot(coefs) biplot(coefs,Name,Value) h = biplot(___) 描述 例 biplot(coefs)在矩 ...