上一节已经介绍了银联的公众号支付业务,以及如何注册成为开发者,这一节将创建一个控制台应用程序调启微信支付并成功付款。

一、请求协议

HTTP(S)

HTTP方法:GET

二、接口地址

测试环境:http://58.247.0.18:29015/v1/netpay/webpay/pay

生产环境:https://api-mop.chinaums.com/v1/netpay/webpay/pay

三、参数

3.1URL参数

参数名称 参数说明 参数类型 长度 是否必须 备注
authorization 认证方式 string   值为OPEN-FORM-PARAM
appId AppId string <=32  
timestamp 时间戳 string 14 yyyyMMddHHmmss
nonce 随机数 string <=128  
content 业务内容 string    
signature 签名 string  

Base64_Encode(HmacSHA256

(appId + timestamp + nonce +

SHA256_HEX(content), AppKey))

3.2业务内容主体(只列出必填与部分主要参数,详细参数请参考官方文档)

格式:JSON

参数名称 参数说明 参数类型 长度 是否必须 备注
msgId 消息ID string <=64 原样返回
requestTimestamp 报文请求时 间 string   格式yyyy-MM-dd HH:mm:ss
merOrderId 商户订单号 string   商户自行生成(下面详细介绍)
mid 商户号 string 15  
tid 终端号 string 8  
instMid 业务类型 string   YUEDANDEFAULT
totalAmount 支付总金额   1..100000000  
notifyUrl 支付结果通知地址 string(url)    
returnUrl 网页跳转地址 string(url)    

四、参数准备

4.1appId、商户号、终端号、来源编码获取

注册成为开发者后可以获取到这几个参数,注册开发者请回顾上一节

4.2订单号规则与生成

以银商分配的4位来源编号作为账单号的前4位,且在商户系统中此账单号保证唯一。总长 度需大于6位,小于28位。银商的推荐规则为(无特殊情况下,建议遵守此规则):{来源编号(4位)}{时间(yyyyMMddmmHHssSSS)(17位)}{7位随机数}

public static string getMerOrderId(string number)//number即来源编号,一般为1017{string time = DateTime.Now.ToString("yyyyMMddHHmmssSSS");System.Random Random = new System.Random();int Result = Random.Next(1000000, 9999999);//7位随机数return number += time += Result;}

4.3 生成签名

Base64_Encode(HmacSHA256(appId + timestamp + nonce + SHA256_HEX(content), AppKey))

private static string createSignature(string appid, string timestamp, string nonce, string body, string appkey){string signature = "";SHA256 sha256 = new SHA256CryptoServiceProvider();byte[] retVal = sha256.ComputeHash(System.Text.Encoding.UTF8.GetBytes(body));StringBuilder sb = new StringBuilder();for (int i = 0; i < retVal.Length; i++){sb.Append(retVal[i].ToString("x2"));}Console.WriteLine("SHA256:" + sb.ToString());var encoding = new System.Text.UTF8Encoding();byte[] keyByte = encoding.GetBytes(appkey);byte[] messageBytes = encoding.GetBytes(appid + timestamp + nonce + sb.ToString());using (var hmacsha256 = new HMACSHA256(keyByte)){byte[] hashmessage = hmacsha256.ComputeHash(messageBytes);signature = Convert.ToBase64String(hashmessage);}return signature;}

4.4业务内容主体

业务主体格式为JSON字符串,示例代码为C#,我们通过引入Newtonsoft库来构建一个JSON对象,后面再转成字符串即可。

JObject jobject = new JObject();jobject.Add("requestTimestamp", timestamp);    // 报文请求时间jobject.Add("merOrderId", merOrderId); // 商户订单号jobject.Add("srcReserve", "qqyl"); // 请求系统预留字段jobject.Add("mid", "898340149000005"); // 商户号jobject.Add("tid", "88880001");    // 终端号jobject.Add("instMid", "YUEDANDEFAULT"); // 业务类型jobject.Add("attachedData", "fjsj"); //商户附加数据jobject.Add("orderDesc", "zdms");  // 账单描述jobject.Add("totalAmount", 1);      // 支付总金额jobject.Add("notifyUrl", "https://www.sina.com.cn");  // 支付结果通知地址jobject.Add("returnUrl", "http://www.baidu.com");  // 网页跳转地址string body = jobject.ToString();

一切准备就绪,下面是完整代码

        /// <summary>/// 前台支付/// </summary>/// <param name="args"></param>static void Main(string[] args){string payUrl = "http://58.247.0.18:29015/v1/netpay/webpay/pay";//测试地址string appid = "10037e6f66f2d0f901672aa27d69XXXX";string appkey = "47ace12ae3b348fe93ab46cee97cXXXX";string timestamp = DateTime.Now.ToString("yyyyMMddHHmmss");string merOrderId = getMerOrderId("1017");string nonce = Guid.NewGuid().ToString().Replace("-","");JObject jobject = new JObject();jobject.Add("requestTimestamp", timestamp);    // 报文请求时间jobject.Add("merOrderId", merOrderId); // 商户订单号jobject.Add("srcReserve", "qqyl"); // 请求系统预留字段jobject.Add("mid", "898340149000005"); // 商户号jobject.Add("tid", "88880001");    // 终端号jobject.Add("instMid", "YUEDANDEFAULT"); // 业务类型jobject.Add("attachedData", "fjsj"); //商户附加数据jobject.Add("orderDesc", "zdms");  // 账单描述jobject.Add("totalAmount", 1);      // 支付总金额,单位:分,也就是支付0.01元jobject.Add("notifyUrl", "https://www.sina.com.cn");  // 支付结果通知地址jobject.Add("returnUrl", "http://www.baidu.com");  // 网页跳转地址string body = jobject.ToString();string signature = createSignature(appid, timestamp, nonce, body, appkey);string connection = "Data Source=.;Initial Catalog=JwsoftBsFrame_20200606;Integrated Security=True;";using (SqlConnection conn = new SqlConnection(connection)){conn.Open();string sql = $"INSERT INTO A0_TestPay(requestTimestamp,appid,merOrderId ) VALUES ({timestamp},'{appid}',{merOrderId})";using (SqlCommand cmd = new SqlCommand(sql, conn)){cmd.ExecuteNonQuery();}}//url即我们需要的最终结果,复制url到微信打开就能调起微信支付string url = payUrl + "?authorization=OPEN-FORM-PARAM&appId=" + appid+ "&timestamp=" + timestamp+ "&nonce=" + nonce+ "&content=" + HttpUtility.UrlEncode(body, Encoding.UTF8) + "&signature=" + HttpUtility.UrlEncode(signature, Encoding.UTF8);Console.WriteLine(url);Console.ReadKey();}/// <summary>/// 生成订单号/// </summary>/// <param name="number"></param>/// <returns></returns>public static string getMerOrderId(string number){string time = DateTime.Now.ToString("yyyyMMddHHmmss");System.Random Random = new System.Random();int Result = Random.Next(1000000, 9999999);return number += time += Result;}/// <summary>/// 生成签名/// </summary>/// <param name="appid"></param>/// <param name="timestamp"></param>/// <param name="nonce"></param>/// <param name="body"></param>/// <param name="appkey"></param>/// <returns></returns>private static string createSignature(string appid, string timestamp, string nonce, string body, string appkey){string signature = "";//先计算出 body 的 sha256加密SHA256 sha256 = new SHA256CryptoServiceProvider();byte[] retVal = sha256.ComputeHash(System.Text.Encoding.UTF8.GetBytes(body));StringBuilder sb = new StringBuilder();for (int i = 0; i < retVal.Length; i++){sb.Append(retVal[i].ToString("x2"));}Console.WriteLine("SHA256:" + sb.ToString());//在结合起来var encoding = new System.Text.UTF8Encoding();byte[] keyByte = encoding.GetBytes(appkey);byte[] messageBytes = encoding.GetBytes(appid + timestamp + nonce + sb.ToString());using (var hmacsha256 = new HMACSHA256(keyByte)){byte[] hashmessage = hmacsha256.ComputeHash(messageBytes);signature = Convert.ToBase64String(hashmessage);}return signature;}

string url = payUrl + "?authorization=OPEN-FORM-PARAM&appId=" + appid
                + "&timestamp=" + timestamp
                + "&nonce=" + nonce
                + "&content=" + HttpUtility.UrlEncode(body, Encoding.UTF8) + "&signature=" + HttpUtility.UrlEncode(signature, Encoding.UTF8);

示例:

http://58.247.0.18:29015/v1/netpay/webpay/pay?authorization=OPEN-FORM-PARAM&appId=10037e6f66f2d0f901672aa27d690006&timestamp=20200831215653&nonce=c31e0e0e47bf49f3968dd73e510be52e&content=%7b%0d%0a++%22requestTimestamp%22%3a+%2220200831215653%22%2c%0d%0a++%22merOrderId%22%3a+%221017202008312156533441158%22%2c%0d%0a++%22srcReserve%22%3a+%22qqyl%22%2c%0d%0a++%22mid%22%3a+%22898340149000005%22%2c%0d%0a++%22tid%22%3a+%2288880001%22%2c%0d%0a++%22instMid%22%3a+%22YUEDANDEFAULT%22%2c%0d%0a++%22attachedData%22%3a+%22fjsj%22%2c%0d%0a++%22orderDesc%22%3a+%22zdms%22%2c%0d%0a++%22totalAmount%22%3a+1%2c%0d%0a++%22notifyUrl%22%3a+%22https%3a%2f%2fwww.sina.com.cn%22%2c%0d%0a++%22returnUrl%22%3a+%22http%3a%2f%2fwww.baidu.com%22%0d%0a%7d&signature=pghTBBzie2qMewmy4FvZuvsLJV%2bqdC%2bhZhTm6T53r%2bE%3d

url即我们需要的最终结果,复制url到微信打开就能调起微信支付。实际业务中,我们只需要构建好好这个url微信中跳转就好。

五、调起微信支付

 

  1. 将程序构建好的url复制到微信中打开,点击访问
  2. 成功调起微信支付后,就是熟悉的付款操作了
  3. jobject.Add("totalAmount", 1);      // 支付总金额,单位:分,也就是支付0.01元
  4. jobject.Add("returnUrl", "http://www.baidu.com");  // 支付成功后网页跳转地址
  5. 如果检查程序没问题,但是点击链接,没有响应的话,可能是测试接口不稳定造成了,请在工作时间内进行测试调用。不是上班时间,估计银联那边把所有访问都拒绝了。

下一节,我们将继续讲解支付结果查询和退款查询的接口调用,我们测试支付的钱可以通过退款接口进行退回的。 

银联支付服务之公众号支付业务(二)相关推荐

  1. 银联支付服务之公众号支付业务(一)

    一.背景 在线支付,是我们常见的业务场景,一般我们都会使用微信支付或者支付宝支付接口完成.但是想要学习测试的话是必须开通支付商户的.这个对于想学习使用微信支付的小伙伴来说是一件很不幸的事情,我很早就想 ...

  2. 微信公众号开发(二)---验证服务与回复消息

    经过第一个阶段的工作,公众号服务器方面的配置已经完成,接下来就是开发环境的搭建了. 准备工作请看上一篇文章: 0. 消息的传递路径 1. 启动XShell,开启端口转发 按照上一篇文章对XShell进 ...

  3. 微信公众号的二次开发(一 订阅号没有获取网页授权的解决方法)

    前言 应公司开发需求,最近需要进行公众号的二次开发.经过系列讨论,最后确定为使用订阅号来开发. 因为公众号开发要获取微信用户的基本信息,需要通过用户授权获取code,然后去换取openid,最后在获取 ...

  4. 微信,支付宝支付,微信公众号小程序授权等

    微信,支付宝支付,微信公众号小程序授权等 前言 微信支付 微信授权 maven依赖(更新) 前言 最近在公司也做了很多移动端项目,如今微信公众号,小程序又特别火爆,免不了要接触支付,授权这类的业务需求 ...

  5. 微信公众号渠道二维码怎么生成?可以进行用户分组吗?

    公众号渠道二维码是一种带参数的二维码,微信公众平台为服务号提供了生成带参二维码的接口,满足服务号的推广分析需求,运营者可以通过渠道二维码来判定粉丝来源,并对用户进行分组管理. 微信公众号渠道二维码的作 ...

  6. 微信公众号(二)每日推送详细教程(AI回复助手)

    微信公众号(二)每日推送详细教程(回复助手) 1.准备阶段 1.1 基础性配置 1.2 账号准备 2. 配置阶段 2.1 配置application.yml文件 2.2 注解 3. 部署 效果图如下 ...

  7. 如何判断微信公众号是否二次开发(一)

    微信公众号是否二次开发,即微信公众号是否使用了公众平台开发接口(其中主要如:自定义菜单接口.配置第三方开发服务器接口.调用外部链接等). 接下来介绍如何用手机直观的去判断微信公众号是否二次开发,主要从 ...

  8. ChatGPT分销版多开4.3.5版本源码 -新增 首页是否弹出公众号关注二维码注册/登录后否弹出公众号ChatGPT分销版4.3.5

    ChatGPT分销版多开4.3.5版本源码,ChatGPT分销版源码升级记录 版本号:4.3.5 - 默认 AI分销版系统源码升级   后台系统配置-界面配置: 新增 首页是否弹出公众号关注二维码 注 ...

  9. Java开发微信公众号(二)---开启开发者模式,接入微信公众平台开发

    接入微信公众平台开发,开发者需要按照如下步骤完成: 1.填写服务器配置 2.验证服务器地址的有效性 3.依据接口文档实现业务逻辑 资料准备: 1.一个可以访问的外网,即80的访问端口,因为微信公众号接 ...

  10. 微信公众号无需二次登录_您无需两次解决问题-您需要一个设计系统

    微信公众号无需二次登录 重点 (Top highlight) The design system concept can be differently defined according to eac ...

最新文章

  1. java获取keyvault_利用KeyVault来加强存储Azure Storage访问密钥管理
  2. 内存泄漏_内存泄漏–测量频率和严重性
  3. python默认参数惹得祸
  4. Java面试题集锦,Java常见面试问题汇总,有需要的小伙伴看过来
  5. 程序猿的节日:1024,今天祝愿全球所有程序猿们、IT精英们节日快乐!——我在上海写代码
  6. 用js写出水仙花数,JS 水仙花数
  7. Win11手机应用大改!全新界面来袭
  8. php 异步post,php – 使用POST的异步cURL
  9. linux 读取内存颗粒,Linux虚拟内存地址转化成物理内存地址
  10. Bean的scope属性
  11. linux bash环境,Win10系统怎样启用Linux Bash环境
  12. android中注册用户界面,Android用户注册界面
  13. Mac电脑问题:磁盘读写NTFS怎么不行?
  14. VC2013同一个工程生成的exe文件显示不同的图标
  15. WPF TextBox多行文本框
  16. 如何用计算机设计衣服,如何用电脑设计服装
  17. MS5837-30BA 水深水压传感器简单介绍
  18. 51单片机串口通信的程序实现与Proteus仿真
  19. html+视频添加字幕,给视频加滚动字幕,给视频加字幕制作mv 录制的视频配背景音乐...
  20. MySQL 查询历史sql记录

热门文章

  1. python转二进制_python转二进制
  2. ISBN码书籍信息查询
  3. 线性代数06 矩阵的逆以及求法
  4. 概率Probability的本质是什么?[附概率基础知识,文末可下载28页PDF]
  5. 揭秘!飞机上不为人知的六大“怪事”
  6. 腾讯云直播生成 推流地址 拉流地址
  7. 【python实现网络爬虫21】天眼查企业数据获取
  8. 截止失真放大电路_BJT的失真
  9. oracle算加权平均的函数,如何用变异函数计算加权平均数?
  10. oracle怎么看alter日志,Oracle 11g 日志alter文件位置