【delphi】微信公众号控件开发(三)微信支付

一、控件已经实现的微信支付方式

序号支付方式是否完成
1付款码支付完成
2JSAPI支付完成
3Native支付完成
4APP支付暂不实现
5H5支付暂不实现
6小程序支付近期完成

二、微信支付Delphi开发要点

  1. 如何实现微信支付中需要的SSL双向认证?
  2. 如何保证签名正确?
  3. 由于微信支付API非常多,每个API都有相当多的参数字段,如何保证快速、准确的用delphi实现数据结构定义?

关于微信支付需要的前期准备,包括申请账号,申请API密钥等等,就不再这里详述了,这个看微信的官方文档就可以实现。

1.何实现微信支付中需要的SSL双向认证?

HTTP请求,以前大家开发都是使用Indy的控件,Delphi从XE开始就提供了原生的HTTPClient控件,TNetHTTPclient控件,使用这个控件的好处是不需要专门的SSL支持库(.DLL)。微信有些API是需要SSL支持的,微信官方提供了SSL密钥文件。估计有些同学使用了TNetHTTPclient控件还是不能和威微信后台正常连接,原因是没有正确的设置密钥串。关键点:

  1. 正确安装好微信的授权文件,必须在需要请求的电脑上安装好,对于windows系统,一般是个p12文件,双击就可以自动安装完成;
  2. 必须在TNetHTTPclient的OnNeedClientCertificate事件中正确选择合适的证书;AnIndex参数就是选择证书的索引号!!!

2.如何保证签名正确?

关于微信支付签名(sign),我在开发中遇到多次坑,但最后总结下来都是自己没有完整按照文档签名,当然也有文档说的并不是非常清晰的,需要尝试。我主要遇到的问题:

  1. 在 JSAPI发起支付签名中忘记了signType字段,可以是MD5或者HMAC-SHA256,结果总是签名失败,后来加上就好了,
  2. 在Native支付中,也出想过URL签名失败问题,当时是密钥搞错了,特别需要注意,网上有人说在微信后台更新下密钥就好了,这肯定是假象。因为微信后台的密钥只有设置的时候能看见,以后就不可见了,所以如果没有把微信后台设置的那个密钥记准确,以后肯定就不能正确签名了,只能重新设置密钥,重新设置的时候记住了,给大家的感觉是重新设置密钥就好了。总之一定要保证密钥也正确!

关于签名错误:一定是自己的程序有问题,比如大小写不一致;密钥不一致;缺少字段等等,无非就是这些问题,只要耐心检查时一定可以的。

3.由于微信支付API非常多,每个API都有相当多的参数字段,如何保证快速、准确的用delphi实现数据结构定义?

微信支付官方文档地址:https://pay.weixin.qq.com/wiki/doc/api/index.html
微信支付API的命令多,同时每个命令的参数也相当多,我们开发的时候时需要把文档转换成我们的delphi程序,最典型的莫过于把API参数转换成delphi容易处理的record类型,朴素的做法是从网站一个字段一个字段拷贝,逐步转换成Delphi的record。
例如:JSAPI支付的统一下单命令的参数
在这里插入图片描述
需要转换成delphi 的记录

//1 ****  JSAPI 支付数据结构定义 ****
  //1.1 统一下单   参见:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1
  TPAY_unifiedorder_Rec = record
      appid           : String; //*公众账号ID	wxd678efh567hg6787	微信支付分配的公众账号ID(企业号corpid即为此appId)
      mch_id          : String; //*商户号		1230000109	微信支付分配的商户号
      device_info	   	: String; //设备号		013467007045764	自定义参数,可以为终端设备号(门店号或收银设备ID),PC网页或公众号内支付可以传"WEB"
      nonce_str	     	: String; //*随机字符串	5K8264ILTKCH16CQ2502SI8ZNMTM67VS	随机字符串,长度要求在32位以内。推荐随机数生成算法

      //sign            : String; //*签名	C380BEC2BFD727A4B6845133519F3AD6	通过签名算法计算得出的签名值,详见签名生成算法
      sign_type	    	: String; //签名类型	MD5	签名类型,默认为MD5,支持HMAC-SHA256和MD5。
      body            : String; //*商品描述 128	腾讯充值中心-QQ会员充值商品简单描述,该字段请按照规范传递,具体请见参数规定
      detail	    	  : String; //商品详情	(6000)	 	商品详细描述,对于使用单品优惠的商户,该字段必须按照规范上传,详见“单品优惠参数说明”
      attach	        : String; //附加数据(127)	深圳分店	附加数据,在查询API和支付通知中原样返回,可作为自定义参数使用。

      out_trade_no    : String; //商户订单号(32)	20150806125346	商户系统内部订单号,要求32个字符内,只能是数字、大小写字母_-|* 且在同一个商户号下唯一。详见商户订单号
      fee_type        : String; //标价币种(16)	CNY	符合ISO 4217标准的三位字母代码,默认人民币:CNY,详细列表请参见货币类型
      total_fee       : integer;//标价金额	88	订单总金额,单位为分,详见支付金额
      spbill_create_ip:	String; //*(64)	123.12.12.123	支持IPV4和IPV6两种格式的IP地址。用户的客户端IP

      time_start      : String; //交易起始时间	(14)	20091225091010	订单生成时间,格式为yyyyMMddHHmmss,如2009年12月25日9点10分10秒表示为20091225091010。其他详见时间规则
      time_expire     : String;  //交易结束时间	(14)	20091227091010 订单失效时间,格式为yyyyMMddHHmmss,如2009年12月27日9点10分10秒表示为20091227091010。订单失效时间是针对订单号而言的,由于在请求支付的时候有一个必传参数prepay_id只有两小时的有效期,所以在重入时间超过2小时的时候需要重新请求下单接口获取新的prepay_id。其他详见时间规则
                                 //time_expire只能第一次下单传值,不允许二次修改,二次修改系统将报错。如用户支付失败后,需再次支付,需更换原订单号重新下单。
                                 //建议:最短失效时间间隔大于1分钟
      goods_tag       : String; //订单优惠标记	(32)	WXG	订单优惠标记,使用代金券或立减优惠功能时需要的参数,说明详见代金券或立减优惠
      notify_url      : String; //*通知地址	(256)	http://www.weixin.qq.com/wxpay/pay.php	异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数。

      trade_type      : String; //*交易类型	(16)	JSAPI JSAPI -JSAPI支付 NATIVE -Native支付 APP -APP支付 说明详见参数规定
      product_id      : String; //商品ID(32)	12235413214070356458058	trade_type=NATIVE时,此参数必传。此参数为二维码中包含的商品ID,商户自行定义。
      limit_pay       : String; //指定支付方式	(32)	no_credit	上传此参数no_credit--可限制用户不能使用信用卡支付
      openid          : String; //用户标识	(128)	oUpF8uMuAJO_M2pxb1Q9zNjWeS6o	trade_type=JSAPI时(即JSAPI支付),此参数必传,此参数为微信用户在商户对应appid下的唯一标识。openid如何获取,可参考【获取openid】。企业号请使用【企业号OAuth2.0接口】获取企业号内成员userid,再调用【企业号userid转openid接口】进行转换

      receipt         : String; //电子发票入口开放标识(8)	Y	Y,传入Y时,支付成功消息和支付详情页将出现开票入口。需要在微信支付商户平台或微信公众平台开通电子发票功能,传此字段才可生效
      scene_info      : String; //+场景信息	(256) 该字段常用于线下活动时的场景信息上报,支持上报实际门店信息,商户也可以按需求自己上报相关信息。该字段为JSON对象数据,对象格式为{"store_info":{"id": "门店ID","name": "名称","area_code": "编码","address": "地址" }} ,字段详细说明请点击行前的+展开
   public
      function Build_Params : TSignature_Params;  //进行数据初始化

  end;

如果我们逐个参数拷贝录入工作量很大,同时也很容易出错,比如拼写错误,比如遗漏字段参数等等。所以我就做了一个工具,可以自动把API参数转换成我们需要的记录格式,提高效率,提高准确率到100%。

三、API命令转换工具

在这里插入图片描述

使用方法:

  1. 在IE中打开API参数的连接,切记只能是IE浏览器,其它浏览器不支持!!!
  2. 用鼠标右键按住图标在这里插入图片描述拖动到IE浏览器的API参数表上(参数表的任何地方);在这里插入图片描述
  3. 此时可以通过箭头所指按键,逐级向上找到TABLE元素,同时IE浏览器中的TABLE元素周边会出现蓝色方框。在这里插入图片描述
  4. 最后按下【转存表格数据】,系统就会把网页中的表格参数自动转换成我们需要的delphi记录定义。在这里插入图片描述由于表格中数据换行,所以个别的注释自己修改下即可。拷贝出需要的数据定义,保证数据完整,不会出现字段不一样的问题!

四、API命令转换工具下载,含源码

这个在我提供的下载中:IE_Spy.rar

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海纳老吴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值