asp.net core 微信APP支付(扫码支付,H5支付,公众号支付,app支付)之4
微信app支付需要以下参数,类封装如下
public class WxPayModel
{
/// <summary>
/// 应用ID
/// </summary>
public string appid { set; get; } = "";
/// <summary>
/// 商户号
/// </summary>
public string partnerid{ set; get; } = "";
/// <summary>
/// 预支付交易会话ID
/// </summary>
public string prepayid { set; get; } = "";
/// <summary>
/// 扩展字段
/// </summary>
public string package { set; get; } = "Sign=WXPay";
/// <summary>
/// 随机字符串
/// </summary>
public string noncestr { set; get; } = "";
/// <summary>
/// 时间戳
/// </summary>
public string timestamp { set; get; } = ""; /// <summary>
/// 签名
/// </summary>
public string sign { set; get; } = "";
}
支付业务逻辑类如下,只需要传递订单号out_trade_no,描述body,价格total_fee,客户端ip,返回一个WxPayModel供app端调用。
/// <summary>
/// 获取微信APP支付需要的信息
/// </summary>
/// <param name="out_trade_no">订单号</param>
/// <param name="body">描述</param>
/// <param name="total_fee">总价</param>
/// <param name="ip">客户IP</param>
/// <returns></returns>
public WxPayModel GetWxAppPayInfo(string out_trade_no, string body, string total_fee, string ip)
{
//构造返回内容,缺少prepayid和sign需要去微信服务器获取
WxPayModel wxPayModel = new WxPayModel()
{
appid = wxPayConfig.appid,
partnerid = wxPayConfig.mchid,
timestamp = Senparc.Weixin.Helpers.DateTimeHelper.GetWeixinDateTime(DateTime.Now) + "",
noncestr = TenPayV3Util.GetNoncestr(),
}; //构造请求参数
Senparc.Weixin.MP.TenPayLibV3.RequestHandler packageReqHandler = new Senparc.Weixin.MP.TenPayLibV3.RequestHandler(); #region 构造请求参数
packageReqHandler.SetParameter("appid", wxPayConfig.appid);//APPID
packageReqHandler.SetParameter("mch_id", wxPayConfig.mchid);//商户号
packageReqHandler.SetParameter("nonce_str", Senparc.Weixin.MP.TenPayLibV3.TenPayV3Util.GetNoncestr());//随机串
packageReqHandler.SetParameter("body", body);
packageReqHandler.SetParameter("out_trade_no", out_trade_no);//订单号
packageReqHandler.SetParameter("total_fee", (int)(Convert.ToDecimal(total_fee) * ) + ""); //金额,以分为单位
packageReqHandler.SetParameter("spbill_create_ip", ip);//IP
packageReqHandler.SetParameter("notify_url", wxPayConfig.notify_url); //回调地址
packageReqHandler.SetParameter("trade_type", "APP");//APP支付 packageReqHandler.SetParameter("sign", packageReqHandler.CreateMd5Sign("key", wxPayConfig.key));//商户API密钥(签名)
#endregion //将参数转为xml字符串
string data = packageReqHandler.ParseXML();
//发起post异步请求,获取返回的内容
var result = PostWithStringFile(wxPayConfig.api_url, data); Log.Info("【GetWxAppPayInfo】订单:" + out_trade_no + ",请求得到的xml:" + result, "微信支付"); var res = System.Xml.Linq.XDocument.Parse(result);//解析xml,为了填充prepay_id参数和_paySign参数。
try
{
//填充prepay_id参数
wxPayModel.prepayid = res.Element("xml").Element("prepay_id").Value; SortedDictionary<string, object> sParams = new SortedDictionary<string, object>();
sParams.Add("appid", wxPayModel.appid);
sParams.Add("noncestr", wxPayModel.noncestr);
sParams.Add("package", "Sign=WXPay");
sParams.Add("partnerid", wxPayModel.partnerid);
sParams.Add("prepayid", wxPayModel.prepayid);
sParams.Add("timestamp", wxPayModel.timestamp);
//填充sign参数
wxPayModel.sign = GetSign(sParams, wxPayConfig.key);
}
catch (Exception ex)
{
Log.Info($"【GetWxAppPayInfo】订单:{out_trade_no },异常:{ ex.ToString()}", "微信支付");
}
return wxPayModel;
}
其中获取微信签名方法如下
#region 获取微信签名
/// <summary>
/// 获取微信签名
/// </summary>
/// <param name="sParams"></param>
/// <returns></returns>
public string GetSign(SortedDictionary<string, object> sParams, string key)
{
string sign = string.Empty;
StringBuilder sb = new StringBuilder();
foreach (KeyValuePair<string, object> temp in sParams)
{
if (string.IsNullOrEmpty(temp.Value +"") || temp.Key.ToLower() == "sign")
{
continue;
}
sb.Append(temp.Key.Trim() + "=" + temp.Value.ToString() + "&");
}
sb.Append("key=" + key.Trim() + "");
string signkey = sb.ToString();
sign = Senparc.Weixin.Helpers.EncryptHelper.GetMD5(signkey);
return sign;
} #endregion
这样只要应用开通了微信app支付功能,就能正确返回app sdk支付所需要的数据。
asp.net core 微信APP支付(扫码支付,H5支付,公众号支付,app支付)之4的更多相关文章
- ASP.NET Core静态文件处理源码探究
前言 静态文件(如 HTML.CSS.图像和 JavaScript)等是Web程序的重要组成部分.传统的ASP.NET项目一般都是部署在IIS上,IIS是一个功能非常强大的服务器平台,可以直接 ...
- Java之微信支付(扫码支付模式二)案例实战
摘要:最近的一个项目中涉及到了支付业务,其中用到了微信支付和支付宝支付,在做的过程中也遇到些问题,所以现在总结梳理一下,分享给有需要的人,也为自己以后回顾留个思路. 一:微信支付接入准备工作: 首先, ...
- 记录:c#实现微信,支付宝扫码支付(一)
因为公司系统业务需要,这几天了解了一下微信和支付宝扫码支付的接口,并用c#实现了微信和支付宝扫码支付的功能. 微信支付分为6种支付模式:1.付款码支付,2.native支付,3.jsapi支付,4.a ...
- ThinkPHP 整合微信支付 扫码支付 模式二 图文教程
这篇文章主要介绍扫码支付场景二. 目前有两种模式,模式一比模式二稍微复杂点,至于模式一与模式二的具体内容,流程,微信开发文档都有详细介绍,这里就不多说废话,接下来赶紧上教程! [title]下载SDK ...
- 浅析微信支付:微信支付简单介绍(小程序、公众号、App、H5)
本文是[浅析微信支付]系列文章的第二篇,主要讲解一下普通商户接入的支付方式以及其中的不同之处. 上篇文章讲了本系列的大纲,没有看过的朋友们可以看一下. 浅析微信支付:前篇大纲 微信支付是集成在微信客户 ...
- 各类最新Asp .Net Core 项目和示例源码
1.网站地址:http://www.freeboygirl.com2.网站Asp .Net Core 资料http://www.freeboygirl.com/blog/tag/asp%20net%2 ...
- 电脑端支付宝支付 -前端获取支付宝返回的form 以及submit 调用支付扫码页面
前端调取支付宝支付接口(后台进行封装,没有直接调取支付宝接口),调用返回的数据中,将会有一串的form表单数据返回,我们需要将此表单在当前调用页面submit下,以跳转到支付扫码页: 支付宝返回的fo ...
- 微信小程序的功能开发工具跟公众号的差别,小程序是一种减负思维对简单APP是巨大打击
微信小程序的功能开发工具跟公众号的差别,小程序是一种减负思维对简单APP是巨大打击 摘要: 小程序和公众号最大的区别有如下四点:1.小程序没有粉丝,开发者在后台能看到的只能是累计用户访问数以及实时统计 ...
- PHP微信公众号JSAPI网页支付(上)
一.使用场景以及说明 使用场景:商户已有H5商城网站,用户通过消息或扫描二维码在微信内打开网页时,可以调用微信支付完成下单购买的流程. 说明:1.用户打开图文消息或者扫描二维码,在微信内置浏览器打开网 ...
- 微信公众号授权,支付,退款总结【shoucang】
1.支付前准备 1.1首先两个平台接入账户. 商户平台:https://pay.weixin.qq.com/index.php/core/home/login?return_url=%2F 公众平台: ...
随机推荐
- css3实现水平、垂直居中
水平居中的方法: 1.父级text-align:center; .parent{ text-align: center; } .child{ display: inline-block; } 2.ta ...
- MyBatis全局配置文件mybatis-config.xml
1.在官方下载的mybatis-3.4.5.zip压缩包中,有我们需要的mybatis核心jar包和mybatis的快速入门的pdf文件 在mybatis的快速入门的pdf文件中,复制如下代码到我们项 ...
- TCP网络编程
TCP网络编程 与UDP不同的是TCP是通过客服端和服务端的方式来传输数据的.客服端:public class TCPClient { /** * @param args * @th ...
- WEB即时通信
问题 传统的浏览器通信方式:基于HTTP协议的请求/响应模式. 早期:通过刷新浏览器来更新服务器端的数据 后来Ajax(XMLHttpRequest是核心):可以不用刷新浏览器更新服务器端数据.但是这 ...
- PWA,SPA,MPA
PWA渐进式应用 特点: 不会部署到应用商店. 离线应用,通过设备进行存储规划 在发布了pwa的网站,浏览器会询问是否安装app到主屏. 方便分享,通过url. 可推送通知 . 通过service w ...
- Python 入门基础19 --面向对象、封装
2019.04.17 一.面向对象与面向过程 二.名称空间操作 三.类与对象的概念 四.语法 五.对象查找属性的顺序 2019.04.18 1.类与对象的所有概念:__init__方法 2.类的方法与 ...
- Struts局部异常与全局异常处理
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAowAAAG3CAIAAACxBJNyAAAgAElEQVR4nOy9z6tk15Ymdv4B0eRU8O
- java 多线程二
java 多线程一 java 多线程二 java 多线程三 java 多线程四 线程中断: /** * Created by root on 17-9-30. */ public class Test ...
- SpringBoot整合Jdbc
(1).添加相关依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId ...
- 扫AR