Winform微信扫码支付
微信支付有好几种支付方式
假设选择“扫码支付方式”,可以由微信公众号网站先访问微信平台获得特定商品的商品支付url,或者直接下订单产生订单支付url,然后这个 url (文本)返回给你的winform程序,你的winform程序就可以在界面上显示这个url 的二维码图案。
当用户用微信扫码,微信会识别这个 url 是支付,就会在手机显示支付流程,用户支付。
当用户支付完毕,微信平台会把信息传给你的微信公众号网站,告诉它相关商品被支付、或者相关订单号的订单被支付。
你的winform程序可以轮询你的微信公众号网站,同时也可以由网站push消息给你的winform程序,总之你的winform程序就能收到上述信息。
再比如说使用微信“刷卡”支付方式,就是用户的手机微信显示“我要付帐”的界面,你的winform扫描其手机上的二维码或者一维条码,把扫描到的信息形成交易支付记录,提交你的微信公众号网站,转发到微信平台。
后边的就是一样的,微信用户确认了支付密码之后,微信平台会将此交易号的支付信息通知你的微信公众号平台,你的 winform 拉取到这个信息或者接收到服务器 push 来的这个信息。
微信公众号平台
即微信公众平台,简称公众号。曾命名为“官号平台”、“媒体平台”、微信公众号,最终定位为“公众平台”,无疑让我们看到一个微信对后续更大的期望。
利用公众账号平台进行自媒体活动,简单来说就是进行一对多的媒体性行为活动,如商家通过申请公众微信服务号通过二次开发展示商家微官网、微会员、微推送、微支付、微活动、微报名、微分享、微名片等,已经形成了一种主流的线上线下微信互动营销方式。
2019年8月26日,微信公众平台已经汇聚超2000万公众账号,不少作者通过原创文章和原创视频形成了自己的品牌,成为了微信里的创业者。
扩展资料
平台的类型
2013年8月5日,微信公众平台进行升级,将微信公众平台分成订阅号和服务号两种类型。
服务号是公众平台的一种帐号类型,旨在为用户提供服务。服务号一个月内仅可以发送四条群发消息。服务号发给用户的消息,会显示在用户的聊天列表中。并且在发送消息给用户时,用户将收到即时的消息提醒。
订阅号是公众平台的一种帐号类型,为用户提供信息和资讯。订阅号每天可以发送一条群发消息。订阅号发给用户的消息,将会显示在用户的订阅号文件夹中。在发送消息给用户时,用户不会收到即时消息提醒。在用户的通讯录中,订阅号将被放入订阅号文件夹中。
微信开发文档 https://pay.weixin.qq.com/wiki/doc/api/index.html
微信扫码支付引用的是第三方的:Senparc.Weixin
引用:
using Senparc.Weixin.MP.TenPayLibV3;
首先,在Form_Load 里面调用生成支付二维码的方法:
/// <summary>
/// Form_Load事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void FormWeChet_Load(object sender, EventArgs e)
{
//调用微信方法,生成支付二维码
WeChatCode();
}
然后写如何生成二维码的方法实现:
/// <summary>
/// 微信二维码生成
/// </summary>
public void WeChatCode()
{
string out_trade_no =System.DateTime.Now.ToString("yyyymmddhhmmss") + Code();//微信订单号要唯一,我这里只是写了一个时间+随机数
var data = new Senparc.Weixin.MP.TenPayLibV3.TenPayV3UnifiedorderRequestData(WeChetConfig.AppId, WeChetConfig.MchId, WeChetConfig.Body, out_trade_no, WeChetConfig.TotalFee, WeChetConfig.SpbillCreateIp, WeChetConfig.NotifyUrl, Senparc.Weixin.MP.TenPayV3Type.NATIVE, WeChetConfig.OpenId, WeChetConfig.PayKey, TenPayV3Util.GetNoncestr());//这个类内容在最下面
var response = TenPayV3.Unifiedorder(data);
var QrCode_url = response.code_url;
var qrdata = new QRCoder.QRCodeGenerator().CreateQrCode(QrCode_url, QRCoder.QRCodeGenerator.ECCLevel.H);
var qrImg = new QRCoder.QRCode(qrdata).GetGraphic(256);
this.pictureBox1.Image = qrImg;
//定时查询支付状态
var timer = new System.Windows.Forms.Timer();
timer.Interval = 5000;//间隔5秒
timer.Tick += (sender2, e2) =>
{
var dataQueryOrder = new Senparc.Weixin.MP.TenPayLibV3.TenPayV3OrderQueryRequestData(WeChetConfig.AppId, WeChetConfig.MchId, null, TenPayV3Util.GetNoncestr(), WeChetConfig.OutTradeNo, WeChetConfig.PayKey);
var queryResult = TenPayV3.OrderQuery(dataQueryOrder);
if (queryResult.trade_state == "SUCCESS")//支付成功
{
//这里写自己的数据库逻辑
}
else if (queryResult.trade_state == "CLOSED")//已关闭
{
MessageBox.Show("该订单已关闭,请重新扫码支付");
WeChatCode();//重新调用生成方法
timer.Stop();
timer.Dispose();
}
else if (queryResult.trade_state == "PAYERROR")//支付失败(其他原因,如银行返回失败)
{
CacelRequest(queryResult);
}
};
timer.Start();
}
写撤销支付的方法:
/// <summary>
/// 撤销支付的订单
/// </summary>
/// <param name="out_trade_no"></param>
public void CacelRequest(OrderQueryResult queryResult)
{
var data = new TenPayV3CloseOrderRequestData(queryResult.appid, queryResult.mch_id, queryResult.out_trade_no, WeChetConfig.PayKey, queryResult.nonce_str);
var closeOrder = TenPayV3.CloseOrder(data);
if (closeOrder.result_code == "FAIL")
{
MessageBox.Show("该订单撤销失败,请联系管理员");
this.DialogResult = DialogResult.Cancel;
}
else
{
MessageBox.Show("该订单已撤销,请重新发起支付请求");
this.DialogResult = DialogResult.Cancel;
}
}
微信订单号的随机数方法:
/// <summary>
/// 微信订单单号的随机数方法
/// </summary>
/// <returns></returns>
private string Code()
{
string RandomCode = "";
for (int i = 0; i < 6; i++)
{
//获取随机数的方法
Random rand = new Random();
int RandKey = rand.Next(0, 10);
RandomCode += RandKey.ToString();
}
return RandomCode;
}
最后是所需要的类:
public class WeChetConfig
{
private readonly static string appId;
private readonly static string mchId;
private readonly static string payKey;
private readonly static string body;
private readonly static string ipAddress;
private readonly static string out_trade_no;
private readonly static int totalfee;
private readonly static string notifyurl;
static WeChetConfig()
{
appId = “”;//这里写APPID
mchId = “”;//这里写商户ID
payKey = “”;//这里写PayKey
body = "商品描述";
totalfee = 1;
notifyurl = "";
string name = Dns.GetHostName();
IPAddress[] ipadrlist = Dns.GetHostAddresses(name);
foreach (IPAddress ipa in ipadrlist)
{
if (ipa.AddressFamily == AddressFamily.InterNetwork)
{
ipAddress = ipa.ToString(); break;
}
}
}
public static string AppId => appId; //微信支付分配的公众账号ID(企业号corpid即为此appId)
public static string MchId => mchId;//微信支付分配的商户号
public static string Body => body; //商品描述
public static string OutTradeNo => out_trade_no; //商户系统内部订单号,要求32个字符内,只能是数字、大小写字母_-|* 且在同一个商户号下唯一。
public static int TotalFee => totalfee; //订单总金额,单位为分
public static string SpbillCreateIp => ipAddress; //APP和网页支付提交用户端ip,Native支付填调用微信支付API的机器IP。
public static string NotifyUrl => notifyurl;//异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数。
public static string OpenId = ""; //trade_type=JSAPI时(即公众号支付),此参数必传,此参数为微信用户在商户对应appid下的唯一标识。
public static string PayKey => payKey;
}