微信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的更多相关文章

  1. ASP.NET Core静态文件处理源码探究

    前言     静态文件(如 HTML.CSS.图像和 JavaScript)等是Web程序的重要组成部分.传统的ASP.NET项目一般都是部署在IIS上,IIS是一个功能非常强大的服务器平台,可以直接 ...

  2. Java之微信支付(扫码支付模式二)案例实战

    摘要:最近的一个项目中涉及到了支付业务,其中用到了微信支付和支付宝支付,在做的过程中也遇到些问题,所以现在总结梳理一下,分享给有需要的人,也为自己以后回顾留个思路. 一:微信支付接入准备工作: 首先, ...

  3. 记录:c#实现微信,支付宝扫码支付(一)

    因为公司系统业务需要,这几天了解了一下微信和支付宝扫码支付的接口,并用c#实现了微信和支付宝扫码支付的功能. 微信支付分为6种支付模式:1.付款码支付,2.native支付,3.jsapi支付,4.a ...

  4. ThinkPHP 整合微信支付 扫码支付 模式二 图文教程

    这篇文章主要介绍扫码支付场景二. 目前有两种模式,模式一比模式二稍微复杂点,至于模式一与模式二的具体内容,流程,微信开发文档都有详细介绍,这里就不多说废话,接下来赶紧上教程! [title]下载SDK ...

  5. 浅析微信支付:微信支付简单介绍(小程序、公众号、App、H5)

    本文是[浅析微信支付]系列文章的第二篇,主要讲解一下普通商户接入的支付方式以及其中的不同之处. 上篇文章讲了本系列的大纲,没有看过的朋友们可以看一下. 浅析微信支付:前篇大纲 微信支付是集成在微信客户 ...

  6. 各类最新Asp .Net Core 项目和示例源码

    1.网站地址:http://www.freeboygirl.com2.网站Asp .Net Core 资料http://www.freeboygirl.com/blog/tag/asp%20net%2 ...

  7. 电脑端支付宝支付 -前端获取支付宝返回的form 以及submit 调用支付扫码页面

    前端调取支付宝支付接口(后台进行封装,没有直接调取支付宝接口),调用返回的数据中,将会有一串的form表单数据返回,我们需要将此表单在当前调用页面submit下,以跳转到支付扫码页: 支付宝返回的fo ...

  8. 微信小程序的功能开发工具跟公众号的差别,小程序是一种减负思维对简单APP是巨大打击

    微信小程序的功能开发工具跟公众号的差别,小程序是一种减负思维对简单APP是巨大打击 摘要: 小程序和公众号最大的区别有如下四点:1.小程序没有粉丝,开发者在后台能看到的只能是累计用户访问数以及实时统计 ...

  9. PHP微信公众号JSAPI网页支付(上)

    一.使用场景以及说明 使用场景:商户已有H5商城网站,用户通过消息或扫描二维码在微信内打开网页时,可以调用微信支付完成下单购买的流程. 说明:1.用户打开图文消息或者扫描二维码,在微信内置浏览器打开网 ...

  10. 微信公众号授权,支付,退款总结【shoucang】

    1.支付前准备 1.1首先两个平台接入账户. 商户平台:https://pay.weixin.qq.com/index.php/core/home/login?return_url=%2F 公众平台: ...

随机推荐

  1. MySQL与宿主Linux之间交互式执行命令

    在MySQL里面执行Linux的命令并返回结果 system commands root@localhost 11:36:23> system cal March 2017 Su Mo Tu W ...

  2. luogu 2294 狡猾的商人 带权并查集

    此题做法多啊 带权并查集,区间dp,前缀和,差分约束 1.自己写的前缀和, 11 #include<bits/stdc++.h> #define rep(i,x,y) for(regist ...

  3. Java——Struts2 crud 简单实例(学习struts2和ssh) 用Myeclipse实现

    1.new web project 2.给新建的web项目添加struts2支持 3.项目结构中有了struts.xml和struts2核心库 4.编码 4.1项目结构图 4.2源代码: (1)DbU ...

  4. 20155332 2016-2017-2 《Java程序设计》第6周学习总结

    20155332 2016-2017-2 <Java程序设计>第6周学习总结 教材学习内容总结 1.文件的读写 2.网络上传数据的基础 3.认识INputStream.OutputStre ...

  5. Linux之Ubuntu安装Sublime

    0.控制台下开启并使用: 为什么先说这一步呢?确实很尴尬,对不对.但确实,当初就是安装好了都不知道咋个用,就是这么蠢...hahahahahahahha 命令行:subl 注意:不是sub,也不是su ...

  6. [C++]动态内存分配问题

    动态分配内存: 1.malloc(int n)/free(&var): https://openhome.cc/Gossip/CGossip/MallocFree.html; 2.new/de ...

  7. luogu P3707 [SDOI2017]相关分析

    传送门 对于题目要求的东西,考虑拆开懒得拆了 ,可以发现有\(\sum x\sum y\sum x^2\sum xy\)四个变量影响最终结果,考虑维护这些值 下面记\(l,r\)为区间两端点 首先是区 ...

  8. luogu P1052 过河

    传送门 容易想到设\(f_i\)表示走到坐标\(i\)的最少走过的石子数 但是这题数据范围很大,,, 不过一次可以走的步数范围是1-10,石子个数最多100个,所以中间会有很多多出来的没石子的路,可以 ...

  9. A - 地精部落 (DP)

    题目链接:https://cn.vjudge.net/contest/281960#problem/A 题目大意:中文题目. 具体思路:首先,如果有一段是山谷的话,那么这一段中也能用来表示山峰,只要将 ...

  10. Hadoop的RPC机制及简单实现

    1.RPC简介 Remote Procedure Call 远程过程调用协议 RPC——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些 ...