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 的感觉!近期离职后,时 ...
随机推荐
- jmeter使用正则表达式匹配多个中的响应结果
一.背景: 同一个正则表达式匹配多个响应结果值,之前都是添加多个正则表达式,一个一个去获取需要的值,比较麻烦:今天尝试了一下用一个正则表达式获取响应中所有需要的值,使用这种方式也能够获取多个结果中指定 ...
- [C++]指针与引用(定义辨析)
1.定义: 1.1 &-----取地址运算符 功能:返变量的内存地址 Eg:int *p,m; 定义p为指向int类型变量的指针,同时定义变量m ...
- python时间序列画图plot总结
画图从直觉上来讲就是为了更加清晰的展示时序数据所呈现的规律(包括趋势,随时间变化的规律(一周.一个月.一年等等)和周期性规律),对于进一步选择时序分析模型至关重要.下面主要是基于pandas库总结一下 ...
- Poj3696 The Lukiest Number
传送门 Solution 懒得写啦 Code #include<iostream> #include<cstdio> #include<cmath> #define ...
- 【加密】Md5Util
import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class Md5U ...
- python - 计算器 程序练习
v1.0 计算器(数据内不含括号方式:) import re def jisuan(a,b,c): sun_count = 0 if c =="+": sun_count = st ...
- Django CSRF提交遇见的问题
简介 django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成.而对于django中设置防跨站请求伪造功能有 ...
- SpringBootTest单元测试实战、SpringBoot测试进阶高级篇之MockMvc讲解
1.@SpringBootTest单元测试实战 简介:讲解SpringBoot的单元测试 1.引入相关依赖 <!--springboot程序测试依赖,如果是自动创建项目默认添加--> &l ...
- android 服务解析
https://blog.csdn.net/luoyanglizi/article/details/51586437 2.service和Thread的区别 定义上: thread是程序运行的最小单元 ...
- DDR3基本知识及测试【转】
转自:http://blog.csdn.net/myarrow/article/details/7847385 一.DDR3简介 DDR3(double-data-rate three synchro ...