asp.net core 微信公众号支付(扫码支付,H5支付,公众号支付,app支付)之3
在微信公众号中访问手机网站,当需要调用支付时候无法使用H5支付,只有使用微信公众号支付,使用公众号支付用户必须关注该公众号同时该公众号必须开通公众号支付功能。
1.获取用户的OpenId ,参考之前写的随笔 https://www.cnblogs.com/jomzhang/p/9209241.html
2.微信公众号支付唤起需要一下几个参数
//定义参数名
string _appId = "appId";
string _nonceStr = "nonceStr";
string _package = "package";
string _signType = "signType";
string _timeStamp = "timeStamp";
string _paySign = "paySign";
如果不使用工具类Senparc.Weixin.MP.TenPayLibV3.RequestHandler去生成签名的话需要注意生成签名时候字符串拼接的顺序
3.微信公共号支付业务类方法
/// <summary>
/// 获取微信内置H5支付需要的信息,公众号支付返回的是个有序字典,利用字典的各个值调用jssdk获取微信内的公众号支付
/// </summary>
/// <param name="out_trade_no">订单号</param>
/// <param name="body">描述</param>
/// <param name="total_fee">总价</param>
/// <param name="ip">客户IP</param>
/// <param name="product_id">商品id</param>
/// <param name="openid">openid</param>
/// <returns></returns>
public SortedDictionary<string, string> GetWxGZHPayInfo(string out_trade_no, string body, string total_fee, string ip, string product_id, string openid = "")
{
//定义参数名
string _appId = "appId";
string _nonceStr = "nonceStr";
string _package = "package";
string _signType = "signType";
string _timeStamp = "timeStamp";
string _paySign = "paySign"; //构造返回参数字典
SortedDictionary<string, string> dicResult = new SortedDictionary<string, string>();
dicResult.Add(_appId, wxPayConfig.appid);
dicResult.Add(_timeStamp, Senparc.Weixin.Helpers.DateTimeHelper.GetWeixinDateTime(DateTime.Now)+ "");
dicResult.Add(_nonceStr, Senparc.Weixin.MP.TenPayLibV3.TenPayV3Util.GetNoncestr());
dicResult.Add(_package, "");
dicResult.Add(_signType, "MD5");
dicResult.Add(_paySign, ""); //构造请求参数
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", "JSAPI");//公共号支付
packageReqHandler.SetParameter("product_id", product_id);//商品ID
packageReqHandler.SetParameter("openid", openid);//OPENID
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("【GetWxGZHPayInfo】订单:" + out_trade_no + ",请求得到的xml:" + result, "微信支付"); var res = System.Xml.Linq.XDocument.Parse(result);//解析xml,为了填充prepay_id参数和_paySign参数。
try
{
//填充prepay_id参数
string prepay_id = res.Element("xml").Element("prepay_id").Value;
Log.Info("【GetWxGZHPayInfo】订单:" + out_trade_no + ",请求得到的prepay_id:" + prepay_id, "微信支付");
dicResult[_package] = "prepay_id=" + prepay_id; //获取MD5签名字符串,注意顺序不能错
string _stringSignTemp = "appId=" + dicResult[_appId] + "&nonceStr=" + dicResult[_nonceStr] + "&package=" + dicResult[_package] + "&signType=" + dicResult[_signType] + "&timeStamp=" + dicResult[_timeStamp] + "&key=" + wxPayConfig.key;
Log.Info("【GetWxGZHPayInfo】_stringSignTemp=" + _stringSignTemp, "微信支付"); //填充_paySign参数
string _sign = Senparc.Weixin.Helpers.EncryptHelper.GetMD5(_stringSignTemp);
dicResult[_paySign] = _sign;
return dicResult;
}
catch (Exception ex)
{
Log.Info($"【GetWxGZHPayInfo】订单:{out_trade_no },异常:{ ex.ToString()}", "微信支付");
return dicResult;
}
}
方法内容为构造一个返回字典dicResult,但package和paySign参数需要请求微信api去获取,构造请求工具类packageReqHandler,请求微信api获取得到xml文件解析得到prepay_id参数,将内容"prepay_id=" + prepay_id填充到package参数。最后就剩下签名字段,构造签名字符串_stringSignTemp(一定注意拼接顺序,微信开发接口有提供签名校验,网址:https://pay.weixin.qq.com/wiki/tools/signverify/),使用md5签名得到paysign,最后返回字典给控制器传给前端即可。注(PostWithStringFile方法和wxPayConfig类在扫码支付篇有贴出)
asp.net core 微信公众号支付(扫码支付,H5支付,公众号支付,app支付)之3的更多相关文章
- Java之微信支付(扫码支付模式二)案例实战
摘要:最近的一个项目中涉及到了支付业务,其中用到了微信支付和支付宝支付,在做的过程中也遇到些问题,所以现在总结梳理一下,分享给有需要的人,也为自己以后回顾留个思路. 一:微信支付接入准备工作: 首先, ...
- C#开发微信门户及应用(41)--基于微信开放平台的扫码登录处理
在现今很多网站里面,都使用了微信开放平台的扫码登录认证处理,这样做相当于把身份认证交给较为权威的第三方进行认证,在应用网站里面可以不需要存储用户的密码了.本篇介绍如何基于微信开放平台的扫码进行网站的登 ...
- 电脑端支付宝支付 -前端获取支付宝返回的form 以及submit 调用支付扫码页面
前端调取支付宝支付接口(后台进行封装,没有直接调取支付宝接口),调用返回的数据中,将会有一串的form表单数据返回,我们需要将此表单在当前调用页面submit下,以跳转到支付扫码页: 支付宝返回的fo ...
- asp.net core 微信扫码支付(扫码支付,H5支付,公众号支付,app支付)之1
2018-08-13更新生成二维码的方法 在做微信支付前,首先要了解你需要什么方式的微信支付,目前本人做过的支付包含扫码支付.H5支付.公众号支付.App支付等,本人使用的是asp.net mvc c ...
- asp.net core 微信H5支付(扫码支付,H5支付,公众号支付,app支付)之2
上一篇说到微信扫码支付,今天来分享下微信H5支付,适用场景为手机端非微信浏览器调用微信H5支付惊醒网站支付业务处理.申请开通微信H5支付工作不多做介绍,直接上代码. 首先是微信支付业务类(WxPayS ...
- asp.net core 微信APP支付(扫码支付,H5支付,公众号支付,app支付)之4
微信app支付需要以下参数,类封装如下 public class WxPayModel { /// <summary> /// 应用ID /// </summary> publ ...
- (实用篇)微信支付扫码支付php版
本文实例为大家分享了php微信扫码支付源码,供大家参考,具体内容如下 代码中包含四个文件createUrl.php.ArrayToXML.php.returnGoodsUrl.php.notifyUr ...
- ThinkPHP 整合微信支付 扫码支付 模式二 图文教程
这篇文章主要介绍扫码支付场景二. 目前有两种模式,模式一比模式二稍微复杂点,至于模式一与模式二的具体内容,流程,微信开发文档都有详细介绍,这里就不多说废话,接下来赶紧上教程! [title]下载SDK ...
- ASP.NET CORE小试牛刀:干货(完整源码)
扯淡 .NET Core 的推出让开发者欣喜万分,从封闭到拥抱开源十分振奋人心.对跨平台的支持,也让咱.NET开发者体验了一把 Write once,run any where 的感觉!近期离职后,时 ...
随机推荐
- 【BZOJ4827】【HNOI2017】礼物
强省HN弱省HA……(读作强省湖南弱省蛤 原题: 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手 环,一个留给自己,一 个送给她.每个手环上各有 n 个装饰物,并且每个 ...
- JavaScript之小工具之日志log()[兼容]
function log(){ try{ console.log.apply(console,arguments); }catch(e){ try{ opera.postError.apply(ope ...
- 【洛谷P1896【SCOI2005】】互不侵犯King
题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 输入输出格式 输入格式: 只有一行,包 ...
- PXC中的GTIDs
基本环境:PXC 5.7.19 Row+Gtid,3节点 一.Galera GTID vs MySQL GTID 1.1.Galera GTID vs MySQL GTID Both kinds of ...
- cetus系列~ 读写分离具体分析
一 简介:上一章我们讲了cetus的基本安装,这章继续分析cetus 二 分析 1 基本配置 1 开启主从延迟检测需在后端数据库创建库proxy_heart_beat和表tb_heartb ...
- mysql 查询优化 ~explain解读之select_type的解读
一 简介:今天咱们来聊聊explain的select_type 二 类型 (1)SIMPLE 简单的SELECT语句(不包括UNION操作或子查询操作) (2)PRIMARY/UNION PRIMAR ...
- Servlet3.0的注解自定义原生Listener监听器实战
简介:监听器介绍和Servlet3.0的注解自定义原生Listener监听器实战 自定义Listener(常用的监听器 servletContextListener.httpSessionListen ...
- 【转】Python数据类型之“数字(numerics)”
[转]Python数据类型之“数字(numerics)” 上一节内容说的是“Python基本语法”,本节主要讲下Python中的数据类型. 存储在内存中的数据通常有两个属性: 在内存中的存放位置:这个 ...
- git操作之冲突解决
应用场景,任哥,我两个人共同修改了git项目上的一个文件.zsh命令行模式 准备工作 简写命令解释 gl=git pullgp=git pushgst=git statusgcmsg=git comm ...
- 在12C上创建wm_concat函数
11gr2和12C上已经摒弃了wm_concat函数,当时我们很多程序员在程序中确使用了该函数,导致程序出现错误,为了减轻程序员修改程序的工作量,只有通过手工创建个wm_concat函数,来临时解决该 ...