在微信公众号中访问手机网站,当需要调用支付时候无法使用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的更多相关文章

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

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

  2. C#开发微信门户及应用(41)--基于微信开放平台的扫码登录处理

    在现今很多网站里面,都使用了微信开放平台的扫码登录认证处理,这样做相当于把身份认证交给较为权威的第三方进行认证,在应用网站里面可以不需要存储用户的密码了.本篇介绍如何基于微信开放平台的扫码进行网站的登 ...

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

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

  4. asp.net core 微信扫码支付(扫码支付,H5支付,公众号支付,app支付)之1

    2018-08-13更新生成二维码的方法 在做微信支付前,首先要了解你需要什么方式的微信支付,目前本人做过的支付包含扫码支付.H5支付.公众号支付.App支付等,本人使用的是asp.net mvc c ...

  5. asp.net core 微信H5支付(扫码支付,H5支付,公众号支付,app支付)之2

    上一篇说到微信扫码支付,今天来分享下微信H5支付,适用场景为手机端非微信浏览器调用微信H5支付惊醒网站支付业务处理.申请开通微信H5支付工作不多做介绍,直接上代码. 首先是微信支付业务类(WxPayS ...

  6. asp.net core 微信APP支付(扫码支付,H5支付,公众号支付,app支付)之4

    微信app支付需要以下参数,类封装如下 public class WxPayModel { /// <summary> /// 应用ID /// </summary> publ ...

  7. (实用篇)微信支付扫码支付php版

    本文实例为大家分享了php微信扫码支付源码,供大家参考,具体内容如下 代码中包含四个文件createUrl.php.ArrayToXML.php.returnGoodsUrl.php.notifyUr ...

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

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

  9. ASP.NET CORE小试牛刀:干货(完整源码)

    扯淡 .NET Core 的推出让开发者欣喜万分,从封闭到拥抱开源十分振奋人心.对跨平台的支持,也让咱.NET开发者体验了一把 Write once,run any where 的感觉!近期离职后,时 ...

随机推荐

  1. ECharts(中国地图)的使用 及 非空 tooltip formatter 验证

    中国地图使用频率很高下载文件:        echarts.min.js网址:               http://echarts.baidu.com/download.html点击:     ...

  2. C# 生成一个带数字的饼图

    using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D ...

  3. JavaScript之Dom操作【删除当前节点】

    //最新更新:2017-11-25 //现在可以通过更强大而快捷的方式为所有的HTMLElement元素的Dom操作扩展新的方法[注意事项:处理HTMLElemnt元素时,此法对IE-8无效] //原 ...

  4. CSS进阶之SASS入门指南

    CSS进阶之SASS入门指南         随着跟着公司学习项目的前端的推进,越来越对好奇了许久的SASS垂涎欲滴,哈哈,可能这个词使用不当,没有关系,就是对SASS有一股神秘的爱!好了,闲话不多说 ...

  5. luogu P1600 天天爱跑步

    传送门 1A此题暴祭 (下面记点\(x\)深度为\(de_x\),某个时间点记为\(w_x\)) 首先,每条路径是可以拆成往上和往下两条路径的 对于往上的路径,假设有个人往上跑,\(w_y\)在点\( ...

  6. java程序运存扩容

    线上程序随着业务增多,运行的越来越慢,初步判定是因为内存分配的太小导致频繁的进行GC和OOM,于是着手增加内存上限. 增加内存上限都知道是修改java启动的opt,因为服务容器是tomcat 首先是在 ...

  7. android当前网络连接类型判断

    package net.nyist.netState; import android.content.Context; import android.net.ConnectivityManager; ...

  8. Cpp读文件、CString转String、String转CString

    场景 C++读取文件 技术点 读取文件 fstream提供了三个类,用来实现c++对文件的操作.(文件的创建.读.写). ifstream -- 从已有的文件读入 ofstream -- 向文件写内容 ...

  9. Generative Adversarial Nets(原生GAN学习)

    学习总结于国立台湾大学 :李宏毅老师 Author: Ian Goodfellow • Paper: https://arxiv.org/abs/1701.00160 • Video: https:/ ...

  10. startup_MK64F12.s文件解析

    1.前言 本文主要对freescale芯片 MK64F12的启动汇编文件进行注释解析. 2.文件注释 /* ---------------------------------------------- ...