关键字:微信支付 微信支付v3 native支付 扫码支付模式一 统一支付 Native支付 prepay_id 
作者:方倍工作室
原文: http://www.cnblogs.com/txw1958/p/wxpayv3-native-static.html

本文介绍微信支付下的基于静态链接二维码的Native支付实现流程。目前该方法被改称为扫码支付模式一。

注意

微信支付现在分为v2版和v3版,2014年9月10号之前申请的为v2版,之后申请的为v3版。V3版的微信支付没有paySignKey参数。v2的相关介绍请参考方倍工作室的其他文章。本文介绍的为微信支付v3。

一、静态链接二维码生成

静态链接二维码的生成过程中,核心是sign签名。下面介绍sign签名过程。

1. 参数准备

唯一要确定的参数是产品的ID号。其他的是支付参数或者由程序生成。程序生成的部分如下。

$this->parameters["appid"] = WxPayConf_pub::APPID;//公众账号ID
$this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商户号
$time_stamp = time();
$this->parameters["time_stamp"] = "$time_stamp";//时间戳
$this->parameters["nonce_str"] = $this->createNoncestr();//随机字符串

产品ID号可以临时这样生成的。

$product_id = WxPayConf_pub::APPID."static";//自定义商品id
$nativeLink->setParameter("product_id","$product_id");//商品id

生成后,数组如下:

object(NativeLink_pub)[1]public 'parameters' => array (size=5)'product_id' => string 'wxdbfd43c561acxxxxstatic' (length=24)'appid' => string 'wxdbfd43c561acxxxx' (length=18)'mch_id' => string '10012345' (length=8)'time_stamp' => string '1419733441' (length=10)'nonce_str' => string 'no6qegpf11rn13nyl2q9izsk60be7fxc' (length=32)

2. 签名生成

1) 将传入参数进行字典序排序,排序后结果如下:

array (size=5)'appid' => string 'wxdbfd43c561acxxxx' (length=18)'mch_id' => string '10012345' (length=8)'nonce_str' => string 'no6qegpf11rn13nyl2q9izsk60be7fxc' (length=32)'product_id' => string 'wxdbfd43c561acxxxxstatic' (length=24)'time_stamp' => string '1419733441' (length=10)

2) 生成URL键值对,生成如下:

appid=wxdbfd43c561acxxxx&mch_id=10012345&nonce_str=no6qegpf11rn13nyl2q9izsk60be7fxc&product_id=wxdbfd43c561acxxxxstatic&time_stamp=1419733441

3) 拼接key,得到新字符串如下:

appid=wxdbfd43c561acxxxx&mch_id=10012345&nonce_str=no6qegpf11rn13nyl2q9izsk60be7fxc&product_id=wxdbfd43c561acxxxxstatic&time_stamp=1419733441&key=abcdefg123456789abcdefg123456789

4) 将新字符串进行md5运算,结果如下

546cd81b0b66f57dc27bfeecea1fb218

5) 签名结果进行大写,结果如下:

546CD81B0B66F57DC27BFEECEA1FB218

至此,成功得到签名。下面可以构造url

3. 签名生成

静态Native支付的链接格式如下

weixin://wxpay/bizpayurl?sign=XXXXX&appid=XXXXX&mch_id=XXXXX&product_id=XXXXXX&time_stamp=XXXXXX&nonce_str=XXXXX

其中 XXXXX 为商户需要填写的内容,将该链接生成二维码,如需要打印发布静态的二维码,采用此格式。

上一步中,生成的所有参数如下所示:

object(NativeLink_pub)[1]public 'parameters' => array (size=6)'product_id' => string 'wxdbfd43c561acxxxxstatic' (length=24)'appid' => string 'wxdbfd43c561acxxxx' (length=18)'mch_id' => string '10012345' (length=8)'time_stamp' => string '1419733441' (length=10)'nonce_str' => string 'no6qegpf11rn13nyl2q9izsk60be7fxc' (length=32)'sign' => string '546CD81B0B66F57DC27BFEECEA1FB218' (length=32)

通过下述函数得到二维码链接地址

//获取链接
$product_url = $nativeLink->getUrl();

构造最终的链接如下所示:

weixin://wxpay/bizpayurl?appid=wxdbfd43c561acxxxx&mch_id=10012345&nonce_str=no6qegpf11rn13nyl2q9izsk60be7fxc&product_id=wxdbfd43c561acxxxxstatic&sign=546CD81B0B66F57DC27BFEECEA1FB218&time_stamp=1419733441

二、请求获取商品信息

1. 参数准备接收XML通知

微信支付配置中,需要配置Native原生支付回调URL
该回调URL将在扫描二维码时发起支付请求,请求将收到扫描静态Native支付链接的通知,接收通知的代码如下:

//使用native通知接口
$nativeCall = new NativeCall_pub();
//接收微信请求
$xml = $GLOBALS['HTTP_RAW_POST_DATA'];

接到到的xml通知格式如下

<xml><appid><![CDATA[wxdbfd43c561acxxxx]]></appid><openid><![CDATA[oc-XIjh32OByBiak_gSZ6JOqGFx8]]></openid><mch_id><![CDATA[10012345]]></mch_id><is_subscribe><![CDATA[Y]]></is_subscribe><nonce_str><![CDATA[PvLH3nsJjQCvwnYY]]></nonce_str><product_id><![CDATA[wxdbfd43c561acxxxxstatic]]></product_id><sign><![CDATA[F1CBDE07E3B5AE6EAF4D4033368264EC]]></sign>
</xml>

同时Native支付将提取product_id,用于统一支付填参

//提取product_id
$product_id = $nativeCall->getProductId();

2. 统一支付流程

下面是固定参数

//使用统一支付接口
$unifiedOrder = new UnifiedOrder_pub();
$this->parameters["appid"] = WxPayConf_pub::APPID;//公众账号ID
$this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商户号
$this->parameters["spbill_create_ip"] = $_SERVER['REMOTE_ADDR'];//终端ip
$this->parameters["nonce_str"] = $this->createNoncestr();//随机字符串
$this->parameters["sign"] = $this->getSign($this->parameters);//签名

下面是其他参数

$unifiedOrder->setParameter("body","贡献一分钱");//商品描述
//自定义订单号,此处仅作举例
$timeStamp = time();
$out_trade_no = WxPayConf_pub::APPID."$timeStamp";
$unifiedOrder->setParameter("out_trade_no","$out_trade_no");//商户订单号
$unifiedOrder->setParameter("total_fee","1");//总金额
$unifiedOrder->setParameter("notify_url",WxPayConf_pub::NOTIFY_URL);//通知地址
$unifiedOrder->setParameter("trade_type","NATIVE");//交易类型
$unifiedOrder->setParameter("product_id","$product_id");//用户标识
//非必填参数,商户可根据实际情况选填
//$unifiedOrder->setParameter("sub_mch_id","XXXX");//子商户号
//$unifiedOrder->setParameter("device_info","XXXX");//设备号
//$unifiedOrder->setParameter("attach","XXXX");//附加数据
//$unifiedOrder->setParameter("time_start","XXXX");//交易起始时间
//$unifiedOrder->setParameter("time_expire","XXXX");//交易结束时间
//$unifiedOrder->setParameter("goods_tag","XXXX");//商品标记
//$unifiedOrder->setParameter("openid","XXXX");//用户标识

然后统一支付获取prepay_id

//获取prepay_id
$prepay_id = $unifiedOrder->getPrepayId();

而统一支付中获取prepray_id的流程是将XML数据

<xml><body><![CDATA[方倍工作室]]></body><out_trade_no><![CDATA[wxdbfd43c561acxxxx1419768128]]></out_trade_no><total_fee>1</total_fee><notify_url><![CDATA[http://wxpay.fangbei.org/wxpayv3/demo/notify_url.php]]></notify_url><trade_type><![CDATA[NATIVE]]></trade_type><product_id><![CDATA[wxdbfd43c561acxxxxstatic]]></product_id><appid><![CDATA[wxdbfd43c561acxxxx]]></appid><mch_id>10012345</mch_id><spbill_create_ip><![CDATA[11.12.16.120]]></spbill_create_ip><nonce_str><![CDATA[fvqqssaahys7qc5cv16tr4qtf1iml3vm]]></nonce_str><sign><![CDATA[F69B71CC28FA9398378F4DB417BAC3D7]]></sign>
</xml>

POST发送到统一支付接口

https://api.mch.weixin.qq.com/pay/unifiedorder

并收到如下响应的XML数据

<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg><appid><![CDATA[wxdbfd43c561acxxxx]]></appid><mch_id><![CDATA[10012345]]></mch_id><nonce_str><![CDATA[JLQ67G1EhjfZvlKv]]></nonce_str><sign><![CDATA[7A4F2751F955C32EB65063CC9E3EAB57]]></sign><result_code><![CDATA[SUCCESS]]></result_code><prepay_id><![CDATA[wx2014122820020936799023550244567827]]></prepay_id><trade_type><![CDATA[NATIVE]]></trade_type><code_url><![CDATA[weixin://wxpay/bizpayurl?sr=yQtNpvo]]></code_url>
</xml>

完成上述统一支付之后,Native支付设置返回参数,实现代码如下

//设置返回码
//设置必填参数
//appid已填,商户无需重复填写
//mch_id已填,商户无需重复填写
//noncestr已填,商户无需重复填写
//sign已填,商户无需重复填写
$nativeCall->setReturnParameter("return_code","SUCCESS");//返回状态码
$nativeCall->setReturnParameter("result_code","SUCCESS");//业务结果
$nativeCall->setReturnParameter("prepay_id","$prepay_id");//预支付ID//将结果返回微信
$returnXml = $nativeCall->returnXml();
echo $returnXml;

上述代码生成的XML如下:

<xml><return_code><![CDATA[SUCCESS]]></return_code><result_code><![CDATA[SUCCESS]]></result_code><prepay_id><![CDATA[wx2014122820020936799023550244567827]]></prepay_id><appid><![CDATA[wxdbfd43c561acxxxx]]></appid><mch_id>10012345</mch_id><nonce_str><![CDATA[e2bpc9fz3ykc2tcpipyvnb1l2qf8my3d]]></nonce_str><sign><![CDATA[32C698EA795C0FBCDBCED622D1E01168]]></sign>
</xml>

这样,一个静态链接Native就完成了。

转载于:https://www.cnblogs.com/txw1958/p/wxpayv3-native-static.html

微信支付开发(2) 扫码支付模式一相关推荐

  1. Java微信支付开发之扫码支付模式二

    官方文档 准备工作:已通过微信认证的公众号,域名可以不通过ICP备案 借鉴了很多大神的文章,在此先谢过了 大体过程:根据固定金额和商品的ID先生成订单,再生成二维码,客户扫一扫付款 模式二支付的流程如 ...

  2. 微信公众号开发之扫码支付

    此项目已开源欢迎Start.PR.发起Issues一起讨论交流共同进步 https://github.com/Javen205/IJPay http://git.oschina.net/javen20 ...

  3. ThinkPHP整合微信支付之Native 扫码支付 模式二

    大家好,这篇文章是继微信支付之Native 扫码支付 模式一之后的微信支付系列教程第三篇:扫码支付之模式二 介绍下扫码支付目前有两种模式,模式一比模式二稍微复杂点,至于模式一与模式二的具体内容,流程, ...

  4. 微信和支付宝H5扫码支付开发记录

    微信和支付宝H5扫码支付开发记录 微信支付 支付宝支付 简单前端实现的一下方法,服务端方法未记录: 微信支付 微信流程步骤简介 1.获取用户code 2.拉起微信支付 支付宝支付 支付宝流程步骤简介: ...

  5. 商户接入微信支付方法(扫码支付、刷卡、app)

    微信支付的几种方式解读: 微信支付商户平台的付款方式有以下几种: 公众号支付:在微信内的商家页面上完成公众号支付 APP支付:在APP中,调起微信进行APP支付 扫码支付:扫描二维码(包含PC网站)进 ...

  6. 微信支付开发(6)--付款码支付(被扫)开发详解

    点此查看 微信公众号/微信网页/微信支付/企业微信/小程序开发合集及源代码下载 本文目录 1. 场景 2. 开发说明 3. 普通商户付款码支付 3.1 项目构建 3.2 编写配置类 3.3 编写网页 ...

  7. ThinkPHP整合微信支付之Native 扫码支付 模式一

    大家好,这篇文章是继微信支付jsapi篇之后的微信支付系列教程第二篇:扫码支付之模式一 介绍下扫码支付目前有两种模式,模式一比模式二稍微复杂点,至于模式一与模式二的具体内容,流程,微信开发文档都有详细 ...

  8. 亲身经历之微信支付沙箱环境扫码支付遇到的那些坑

    很多用户在调用微信支付扫码支付沙箱环境都一脸迷茫,废话不多说,遇到很多坑,为了让大家少走弯路下面直接说说我开发微信支付遇到坑,微信沙箱不是一般的坑,是很大的坑. 1.首先下载的官方demo,不能直接用 ...

  9. PHP 支付PC端扫码支付、APP接口调起支付宝支付、微信公众号接入支付宝支付

    第一:第三方支付原理 第二:支付接口申请流程 地址:https://docs.open.alipay.com/270/105899/ : 参考地址:https://blog.csdn.net/nove ...

最新文章

  1. python json数据的文件读写操作
  2. centos 安装搜狗输入法_Ubuntu 20.04 安装搜狗输入法
  3. south eastern china at a scope of 100km
  4. rpm mysql 指定目录_rpm 安装并配置MySQL(包含指定数据存储路径)
  5. ASP.NET中高级程序员 面试题
  6. 用FFmpeg从视频截取任意一帧图片的解决办法~
  7. android+水滴粘性动画,Android控件实现水滴效果
  8. php 5.5 xhprof for windows
  9. 跟ASP.NET MVC一起使用jQuery
  10. vue 解决跨域 调试_vue+Java后端进行调试时解决跨域问题的方式
  11. python : sha256 、ripemd160
  12. Win10个人使用软件清单
  13. python写出租车计费系统_出租车自动计费器设计(课程设计报告模板)
  14. Php freeradius 认证,FreeRADIUS 配置认证记录入数据库
  15. Win 10 专业版重新激活详细操作步骤
  16. JAVA发送HttpClient
  17. gtx660 linux驱动下载,佳能 GeForce GTX 660 驱动程序下载-更新佳能软件(显卡)
  18. SIGIR20|LightGCN: Simplifying and Powering Graph Convolution Network for Recommendation
  19. HTML基于Vue实现Cron生成器
  20. github开源代码下载并运行

热门文章

  1. 有些卖花生的人6.5元拿货,却卖6元,这是怎么回事?求解?
  2. 农村这么好,为什么感觉大家都不想在农村生活呢?
  3. 现在市面上卖的贵州茅台镇原浆酒20元一瓶是什么酒?
  4. 老板应该如何运用人才?
  5. 月入1万的工作,招不到人,怎么办?
  6. 普通人,如何实现年收入百万?
  7. 双网关,可以上内网或外网,如何同时上内网和外网?
  8. 使用OStressSQL Server压力测试
  9. CnCiswumWN
  10. SQLServer通过链接服务器调用Oracle 存储过程