C#微信公众号支付接口对接

C#中实现微信支付 上述代码中,你需要将"APPID"、“MCHID”、"KEY"和"APPSECRET"替换为你自己的微信支付相关信息。然后,使用TenPayV3类创建微信支付API,并调用GetNativePayRequestInfo方法构造支付请求参数。要在C#中实现微信支付,你可以使用微信官方提供的开发工具包 - 微信支付SDK。请注意,你还需要在微信支付平台上设置支付结果通知地址,并确保你的项目能够接收和处理支付结果通知。然后,你可以从微信支付开放平台下载微信支付SDK,并将其添加到你的C#项目中。 阅读详情

这次是第二次对接微信公众号的支付了,第一次代码写的很乱,没有找现成的SDK,感觉里面乱七八糟的东西太多不够清爽,而我仅仅是做一个小功能,对接又不复杂干脆自己做。

不想重复做轮子的朋友可以参考一下:Senparc C# SDK  

这里我只说一下公众号内支付,APP以及其他的支付,等我以后用得到的时候再总结。

简单的说对接过程分为4步

1、拿到用户的openid
2、使用微信接口下单获取preorder_id
3、前端H5调用微信支付对话框
4、接收微信支付结果的通知

好了,现在开始具体过程介绍


0.公众号信息准备

1、公众号的appid,appsecret
登录微信公众平台,在开发一栏里找到基本配置

这里写图片描述

这里写图片描述

2、微信支付平台的商户id(mch_id), 支付key(这个是自己设置的)



1.获取用户openid

每个用户在公众号里都有一个唯一的openid,公众号可以通过openid获取用户的信息,当然获取用户信息是需要用户同意的。但是只获取openid不需要用户同意。

这里没提到的内容可以参考官方文档,:微信网页授权

要获取openid,首先要获取code,然后根据code获取openid。这个过程是为了要用户授权,也就是下面的绿色页面。

获取code跳转到这个链接:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

参数
appid:是公众号的唯一标识
redirect_uri:是授权后重定向的回调链接地址,请使用urlEncode对链接进行处理
response_type:返回类型,请填写code
scope:是应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息)
state:否 重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节
#wechat_redirect 是 无论直接打开还是做页面302重定向时候,必须带此参数

在这里我们scope参数使用snsapi_base,使用snsapi_userinfo 会弹出绿色页面,但是结果是一样的。

这里写图片描述

如果没出错的话,页面会跳转到指定的redirect_uri页面,并附带上code和state参数。

获取code后,请求以下链接获取access_token:
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

参数
appid:公众号的唯一标识
secret:公众号的appsecret
code:填写第一步获取的code参数
grant_type:填写authorization_code

正确时返回的JSON数据包如下

{ "access_token":"ACCESS_TOKEN",    
 "expires_in":7200,    
 "refresh_token":"REFRESH_TOKEN",    
 "openid":"OPENID",    
 "scope":"SCOPE" } 

看到这里面的openid这个参数没?这时就可以取用了,获取到的refresh_token可以保存起来,以后直接用refresh_token获取openid。


2.获取prepay_id

使用微信公众号支付必须在微信留个案底,需要把订单信息提交给微信,这时候就需要使用统一下单接口,官方文档

处于安全角度,使用这个接口需要对传输的信息加密,为了避免篡改,需要用到支付key,过程是这样的:
1、生成一个随机数:32位,可以创建一个Guid。
2、生成安全签名:把提交到微信的参数按照首字母字典排序(a-z),编辑成key=value&key=value…的形式,然后末尾加上key,用md5加个密。
3、创建提交的xml
4、使用post提交到微信接口


· 把要传的参数使用字典排序(除了sign):

SortedDictionary<String, String> param = new SortedDictionary<string, string>();
param.Add("appid", appid);
param.Add("attach", attach);
param.Add("body", body);
param.Add("mch_id", config.mchid);
param.Add("nonce_str", Guid.NewGuid().ToString().Replace("-", "").ToUpper());
param.Add("notify_url", notifyurl);
param.Add("openid", openid);
param.Add("out_trade_no", orderno);
param.Add("spbill_create_ip", System.Web.HttpContext.Current.Request.UserHostAddress);
param.Add("total_fee", ((Int32)(price * 100)).ToString());
param.Add("trade_type", "JSAPI");

· 参数生成字符串

private String GetUnEncyptKey(SortedDictionary<String, String> sort)
 {
      List<String> lstParam = new List<String>();
      foreach (var item in sort)
      {
          lstParam.Add(String.Format("{0}={1}", item.Key, item.Value));
      }
      return String.Join("&", lstParam);
}

· MD5加密

/// <summary>
/// 签名字符串
/// </summary>
/// <param name="prestr">需要签名的字符串</param>
/// <param name="key">密钥</param>
/// <param name="_input_charset">编码格式</param>
/// <returns>签名结果</returns>
public static string Sign(string prestr, string key, string _input_charset)
{
     StringBuilder sb = new StringBuilder(32);
     prestr = prestr +"&key="+ key;
     MD5 md5 = new MD5CryptoServiceProvider();
     byte[] t = md5.ComputeHash(Encoding.GetEncoding(_input_charset).GetBytes(prestr));
     for (int i = 0; i < t.Length; i++)
     {
         sb.Append(t[i].ToString("x").PadLeft(2, '0'));
     }
     return sb.ToString();
}

· 把刚才生成的sign加入到SortedDictionary中然后生成xml:

param.Add("sign", "签名值");
/// <summary>
/// 把提交的参数参数转换为xml
/// </summary>
/// <param name="requestInfo"></param>
/// <returns></returns>
public static String GetPostXML(SortedDictionary<String, String> requestInfo)
{
    List<String> xml = new List<String>();
    xml.Add("<xml>");
    SortedDictionary<String, String> post_param = ExcludeEmpty(requestInfo);
    foreach (var item in post_param)
    {
        if (item.Key == "detail")
        {
            xml.Add(String.Format("<{0}><![CDATA[{1}]]</{0}>", item.Key, item.Value));
        }
        else {
            xml.Add(String.Format("<{0}>{1}</{0}>", item.Key, item.Value));
        }
    }
    xml.Add("</xml>");
    return String.Join("", xml);
    }

(微信的detail 是使用CDATA防止xml转义的,其他参数不能采用)

好了,把XML使用POST提交到接口吧,地址是:https://api.mch.weixin.qq.com/pay/unifiedorder

返回结果也是xml的,可以返序列化。使用这段代码可以直接反序列化成实体类:

/// <summary>
/// 反序列化xml
/// </summary>
/// <param name="xml">XML字符串</param>
/// <returns></returns>
public static T Deserialize<T>(string xml)
{
    try
    {
        String typename=typeof(T).Name;
        xml = xml.Replace("<xml>", "<" + typename + ">").Replace("</xml>", "</" + typename + ">");
        using (StringReader sr = new StringReader(xml))
        {
            XmlSerializer xmldes = new XmlSerializer(typeof(T));
            return (T)xmldes.Deserialize(sr);
        }
    }
     catch (Exception e)
    {
        return default(T);
    }
}

好了,正常情况下就可以获取到prepay_id了。


3.前端H5调用微信支付对话框

请参考官方文档

对接过统一下单接口,这个过程就很简单了。按照这个文档做就好了。这里的随机字符串和签名都是重新生成的,生成方式和前面说的一样。

前端页面JS:

function onBridgeReady() {
    WeixinJSBridge.invoke(
        'getBrandWCPayRequest', {
            "appId": "wx8888888888888888",     //公众号名称,由商户传入     
            "timeStamp": "1414561699",         //时间戳,自1970年以来的秒数     
            "nonceStr": "5K8264ILTKCH16CQ2502SI8ZNMTM67VS", //随机串     
            "package": "prepay_id=123456789",
            "signType": "MD5",         //微信签名方式:     
            "paySign": "C380BEC2BFD727A4B6845133519F3AD6" //微信签名 
    },
    function (res) {
        if (res.err_msg == "get_brand_wcpay_request:ok") {
           //支付成功,后续自行处理
        }
        else
        {
            //支付取消,或者其他错误,自行处理
        }
    });
}

好了,到现在支付就完成了,下面还需要获取一下支付通知,最终确认一下支付状态。


4.接收支付通知

请自行阅读一下,官方文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7

简单说明一下文档中return_code 和result_code 分别表示通信结果和业务(支付)执行结果。收到参数后自己记录一下信息,尤其是支付单号transaction_id,然后再按照约定格式返回一个xml表示成功就可以了。

必须要注意的是,一定要对收到的参数进行签名,验证收到的消息来源是否来自微信,千万不可懒。因为加密所需的key只有你和微信知道,所以加密结果可能能对起来。如果key泄漏了会很危险,因为其他人可能会伪造一个结果,告诉你支付成功了。key可以在微信支付平台中修改。



最后

这次对接过程还比较顺利,没有遇到什么坑,记得第一次做微信接口的时候,不知道是文档我没理解,还是其他什么原因,用了很长事件。当然只按照上面说的是不行的,这里只是提供一个思路和几个辅助的代码段,还需要按照你自己的业务逻辑进行改造,至于其他接口大同小异,不在叙述了。

对接第三方支付常见问题(微信,支付宝,京东,翼支付等等) 常见问题1.1. 支付相关1.2.商户相关 1.1. 支付相关 请看第一版 :链接: 对接支付宝、微信、第三方支付,超详细讲解+demo演示. 1.支付 公众号接入扫呗支付,需要提前在微信公众号官方后台申请开通微信支付吗?公众号的支付功能已经停用,还能接入扫呗支付吗? 微信官方公众号后台的支付渠道,与扫呗的微信支付渠道没有任何关系,微信公众号是否开通微信官方支付渠道不会影响扫呗支付接入。扫呗客户... 阅读详情

相关推荐

微信公众号支付回调页面处理asp.net

微信公众号支付回调页面处理

a15828444995的博客 3879

2023微信支付对接全流程

各场景下微信支付对接流程、准备工作及代码开发

weixin_45029496的博客 1万+

vue对接微信支付 后端用 C#

微信支付是指使用微信账户进行支付的方式,是一种快捷、安全、便捷的支付方式,可以实现在线支付、扫码支付等功能。微信支付分为APP支付、公众号支付、扫码支付、小程序支付等几种方式。在本文中,我们将介绍如何使用微信公众号支付。在“开发”-“基本配置”页面,获取公众号的AppID和AppSecret等信息,这些信息将用于后续的微信支付接口配置。在C#中,我们可以使用官方提供的微信支付SDK,该SDK已经封装了微信支付接口,方便我们调用。在开始使用微信支付之前,您需要在微信公众号平台上创建一个公众号,并通过认证。

持之以恒 469

java对接微信支付SDK接口

在微信公众平台https://mp.weixin.qq.com/ 注册应用,类型只选择“公众号/小程序/企业微信”,注册完成后需完成”微信认证“(微信收取300元),在基础配置中拿到开发者ID(微信支付 APIv3 使用由 证书授权机构(Certificate Authority,简称CA)签发的证书,商户申请证书时,证书工具会生成。在微信支付商户平台https://pay.weixin.qq.com注册商户,在账户中心-api安全中设置。在账户中心-商户信息中拿到微信支付。-- 微信支付SDK -->

u013534849的专栏 6751

c# 微信jsapi支付

ps:接着之前的完成了微信授权获取用户的基础信息外微信支付也需要快速完成,支付的确很多坑,大多数是不认真阅读开发文档导致stemp1 :发起预支付api此处遇到的坑是,由于需求中的信息,例如公众号下对应一个商户号,但是需求文档中给的商户号是错误的,不是这个公众号对应下的商户号,直接被返回 公众号与商户号不一致!!!,此时经历了寻找好几个部门的人,终于找到了对应的商户号!然而已经懵逼了好久….#reg

大光的博客 1705

4.C#对接微信Native支付(调用支付下单生成二维码接口)

在完成了前边几篇文章的操作后,我们接下来需要写实际的业务接口。调用微信的native下单接口。 大概的流程是:商户后台系统先调用微信支付的Native下单接口,微信后台系统返回链接参数code_url,商户后台系统将

你要明白,任何问题都不是孤立存在的,一定有人曾经遇到过,并且已经有更好的解决办法了,只是我还不知道。我不应该在黑暗中独自前行,去重新发明轮子,也许我的顿悟,只是别人的基本功!我应该要站在巨人的肩膀上,学习更成熟的经验和方法,然后再来解决这个问题 2910

C#微信支付对接

c#版在pc端发起微信扫码支付 主要代码: /** * 生成直接支付url,支付url有效期为2小时,模式二 * @param productId 商品ID * @return 模式二URL */ public string GetPayUrl(string productId,...

weixin_30273931的博客 391

2.C#对接微信Native支付(接入前准备)

C#对接微信Native支付(接入前准备)

你要明白,任何问题都不是孤立存在的,一定有人曾经遇到过,并且已经有更好的解决办法了,只是我还不知道。我不应该在黑暗中独自前行,去重新发明轮子,也许我的顿悟,只是别人的基本功!我应该要站在巨人的肩膀上,学习更成熟的经验和方法,然后再来解决这个问题 856

C#完成JSAPI支付(一)

微信H5支付

ckk_0821的专栏 4326

3.C#对接微信Native支付(注册微信支付)

C#对接微信Native支付(注册微信支付native)

你要明白,任何问题都不是孤立存在的,一定有人曾经遇到过,并且已经有更好的解决办法了,只是我还不知道。我不应该在黑暗中独自前行,去重新发明轮子,也许我的顿悟,只是别人的基本功!我应该要站在巨人的肩膀上,学习更成熟的经验和方法,然后再来解决这个问题 1338

微信支付Demo C#版

微信支付绑卡支付微信支付绑卡支付微信支付绑卡支付微信支付绑卡支付微信支付绑卡支付微信支付绑卡支付微信支付绑卡支付

C# .NET MVC微信JSAPI支付

C# .NET MVC微信JSAPI支付 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 开发工具与关键技术:Visual Studio 2015 ASP .NET MVC 作者:熊俊杰 撰写时间:2020.8.7 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 经过本人不断翻找资料和百度终于结合一些大佬的经验和思路弄出来一个MVC的微信支付了。 再弄微信支付之前我们需要先有一个商户号,并且开

weixin_44486443的博客 1365

IAR for ARM 搭建STM32F103C8T6工程模板(实战指南)

本文详细介绍了如何在IAR for ARM开发环境中为STM32F103C8T6微控制器搭建完整的工程模板。从环境准备、固件库获取、目录结构设计到工程配置与编译调试,提供了实战指南和常见问题解决方案,帮助开发者快速建立稳定的STM32开发环境。

fun88的博客 988

C#微信公众号HIS预约挂号系统源码

一、开发环境 ❀技术架构:net ❀开发语言:C# ❀开发工具:VS2019 ❀前端框架:uni-app ❀后端框架:net ❀数 据 库:SqlServer 2012 ❀移 动 端:微信公众号、支付宝小程序

源码技术栈的博客 3765

Windows系统下Mamba环境配置实战:从零到编译成功

本文详细记录了在Windows系统下从零开始配置Mamba深度学习环境的完整实战过程。针对官方不直接支持Windows的难点,文章提供了关键解决方案,包括安装特定版本的Python、PyTorch与第三方Triton,以及修改源码以解决Windows编译器的兼容性问题,最终成功编译并运行Mamba-SSM。

weixin_28842269的博客 500

汇川伺服Modbus-RTU通讯实战:从帧结构解析到西门子PLC配置

本文详细解析了汇川伺服与西门子PLC通过Modbus-RTU协议进行通讯的实战步骤,包括帧结构解析、硬件连接、参数设置及PLC程序配置。通过具体案例和常见问题排查指南,帮助工程师快速掌握工业自动化中的通讯技术,提升设备调试效率。

weixin_33670713的博客 453

[微信支付]C# .net 微信扫码Native支付模式二以及成功回调

0x0001 前言 经过一周的摧残,终于完成了微信支付,做完总结一下,觉得其实并不难,主要是网上没有一个明确的教程. 本文是基于C#语言上进行开发,其实本人是做java的,但由于最近接手维护的项目是C#的,所以也强制让自己简单的熟悉一遍C#(偷偷的说,我C# .net .asp都还没清楚,不过最重要的是思路,语言只是一种工具~~~) 0x0002 项目背景(可略过) 项目类型:在线考试系统;...

YuanMxy'Home 1万+

PSIM+PIL+CCS三剑客:手把手教你搞定DSP28335的软硬件联合调试

本文详细介绍了如何利用PSIM、PIL与CCS三款工具,实现DSP28335的软硬件联合调试。通过搭建兼容环境、从PSIM仿真生成PIL代码,再到实战联合调试与问题诊断,手把手指导开发者构建从虚拟模型到实际硬件的完整验证闭环,有效提升电力电子与电机驱动等领域的开发效率与可靠性。

weixin_29183637的博客 186

c# 微信支付,问题及解决

1.点击支付出现错误:redirect_uri 参数错误。 解决:去到微信公众平台--》开发者中心--》网页服务--》网页账号    点击修改,填写微信支付所在的域名。 2.目录授权 解决:去到微信公众平台--》微信支付--》开发配置--》支付配置(修改) 3.  微信支付,前面的流程都走通了,签名一切正常了。就是最后一步的时候,不调用这个页面 解决

静哥亻门 3073

AD9613操作控制

输出250M时钟给AD9613,过FPGA ILA逻辑分析仪将AD9613采集的两个通道ADC数据250M数据显示出来。其中AD9613输出的是LVDS数据,通过select IO核转为并行数据。 一,搜索IP核:selectIO interface wizad ,并双击配置 配置为input,DDR模式,数据位宽为12bit,IO类型为差分,这里配置的是12对数据差分对。然后配置外部差分时钟。 将tap setting 设置为13,将时钟的边沿对准数据的中间,以免数据出错 二,

wangjie36的博客 4047

学Simulink——基于电能质量治理的场景实例:静止无功发生器(SVG)与并网逆变器的结合

本文详细介绍了基于Simulink的SVG与光伏并网逆变器联合仿真建模方法。系统包含光伏单元、SVG主电路、控制策略(无功检测+双闭环控制)等模块,通过ip-iq法实现动态无功补偿。仿真结果表明,SVG能快速响应负载变化,将功率因数提升至0.98以上,有效稳定母线电压。该方案为新能源并网系统提供了有功/无功协同控制解决方案,具有10ms级响应速度和±5kvar补偿能力。文章提供了完整的建模流程、控制算法实现和结果分析,可作为电力电子与电能质量治理领域的实践指导。

amy_mhd的博客 167

微信支付开发C# SDK JSAPI支付开发流程

微信支付开发流程 1. 开通微信支付功能 省略 2. 下载微信的C#版的微信SDK 下载连接:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1 各个版本的都有,可惜咱最熟悉C# 我的下载时间是2016-02-28日,所以所有的流程都是基于这个版本的SDK。 3.

charliye的博客 2324

专栏三:解析spatialCNV的使用

文章Spatially resolved clonal copy number alterations in benign and malignant tissue发在natur

m0_58549466的博客 1252

C#实现微信扫码支付

第一步:获取AppID AppSecret(去微信公众平台申请网址https://mp.weixin.qq.com/) 第二步:下载微信支付demo WxPayAPI,其中两个包business,lib,添加到项目中。 第三步:lib包中的有一个类文件config.cs有几个基础参数的要设置,这几个appid,mchid,key,APPSECRET,是在你申请通过微信支付接口后获取的。代码贴上来 ...

yuanfang5188的博客 5158

什么是华为OD?怎么才能通过华为OD机试?华为OD机试怎么刷题?(2024最新华为OD机试E卷更新中)

华为OD是Outsourcing Dispacth模式,是华为和外企德科联合招聘的简称。目前华为大多数是OD招聘。OD模式也是华为提出的一种新的用工形式,每年都会从OD项目挑优秀员工转为正编。所有OD和正式员工一样对待,没有差别,部门平时开会、评审等活动都是一起参加的,是同薪同酬,都是由华为的HR直接定的薪资,看的是我们技术能力。华为是大企业,能到华为上班也是有能力的,每个部门都有好多职位,是金子,在哪都会发光。

KJ.JK 11万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C#实现微信支付

C#实现微信支付  最近在做微信公众号开发,在微信支付上遇到一些问题,困惑了3天,今天终于搞定。期间要感谢一些大神的帮助,趁热下面分享一下我的经验。在实现微信支付之前,需要到微信开发平台认证,这些认证和配置信息我就不多说了,这里主要从代码层面实现支付。 12345678910111213141516171819202122232425function onBridgeReady(){   Weix...

Andrewniu的博客 1万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

上一篇: 使用Git进行产品代码管理的总结
下一篇: C#使用Windows Service 启动和关闭IISExpress
Justin_Chia
博客等级 码龄19年 16粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值