微信H5 回调_PHP实现微信H5支付

今头日条一小马奔腾 2019-09-27 18:44:37

开发前配置
进行代码接入前,需在微信后台填写授权回调域名,此域名必须经过ICP备案开发主要流程

  • 用户下单时选择微信支付
  • 商户进行业务逻辑处理并调用微信统一下单接口,微信H5交易类型为:trade_type=MWEB
  • 调用下单接口成功时,微信会返回包含支付跳转URL等相关参数,商户通过参数mweb_url调起支付中间页
  • 在中间页微信会进行H5权限的校验
  • 支付成功,微信会向商户发送异步结果通知

正式开发

  • 调起微信支付,只说明必要参数
  • 请求微信统一下单接口,接口地址:https://api.mch.weixin.qq.com/pay/unifiedorder

接口请求参数

  • appid:微信公众号iD
  • mch_id:账户号
  • nonce_str:随机字符串,不长于32位
  • sign:签名
  • body:商品描述
  • out_trade_no:商户订单号,不长于32位
  • total_fee:总金额,以分为单位
  • spbill_create_ip:用户端请求支付时的IP
  • notify_url:异步通知回调地址,必须是可直接访问地址,不能携带参数
  • trade_type:交易类型,如H5则是MWEB

以上便是H5支付下单所需要的参数
签名生成

  • 参与生成签名的参数必须非空
  • 参数按照ASCII码由小到大排序,参数名区分大小写
  • 按照上述规则,将参数拼接成如k1=v1&k2=v2....的字符串
  • 将上一步得到的字符串拼接上key, 如k1=v1&k2=v2&key=192006250b4c09247ec02e
  • 再将最后得到的字符串进行MD5加密,再转为大写,即为最终的sign值

代码:
/**
* 组建签名
* @param array $params 请求参数
* @param string $key 秘钥
*/
public function genSign($params, $key)

{

foreach ($params as $k=>$v) {

if (!$v) {

unset($params[$k]);

}

}

ksort($params);

$paramStr = '';

foreach ($params as $k => $v) {

$paramStr = $paramStr . $k . '=' . $v . '&';

}

$paramStr = $paramStr . 'key='.$key;

$sign = strtoupper(md5($paramStr));

return $sign;

}
发起请求
将参数转为XML数据,即可发起请求
将数组转为XML代码:
/**
* 将数组转为XML
* @param array $params 支付请求参数
*/
public function array_to_xml($params)
{
if(!is_array($params)|| count($params) <= 0) {
return false;
}
$xml = "<xml>";
foreach ($params as $key=>$val) {
if (is_numeric($val)) {
$xml.="<".$key.">".$val."</".$key.">";
} else {
$xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
}
}
$xml.="</xml>";
return $xml;
}
请求代码:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
$return = curl_exec($ch);
curl_close($ch);
return $return;
微信返回的是XML数据:
<xml><return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
<appid><![CDATA[wxdded766660f9b840]]></appid>
<mch_id><![CDATA[1516216351]]></mch_id>
<device_info><![CDATA[100]]></device_info>
<nonce_str><![CDATA[2DUN2i2pGnlC6vDi]]></nonce_str>
<sign><![CDATA[95CEA831D598299097A32D8FEEC6BDEF]]></sign>
<result_code><![CDATA[SUCCESS]]></result_code>
<prepay_id><![CDATA[wx22194530678545eb3713f2f10724143329]]></prepay_id>
<trade_type><![CDATA[MWEB]]></trade_type>
<mweb_url><![CDATA[https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx22194530678545eb3713f2f10724143329&package=87106983]]></mweb_url>
return_code为SUCCESS代表支付请求成功;
mweb_url则为支付跳转页,此时客户端通过mweb_url已经可以调起微信支付
中间页处理
在得到微信返回的mweb_url参数后,可在服务端进一步获得deepLink
代码:
/**
* 获取微信支付中间页deepLink参数
* @param string $url 微信返回的mweb_url
* @param string $ip 用户端IP
*/
public function getDeeplink(string $url, string $ip)

{

$headers = array("X-FORWARDED-FOR:$ip", "CLIENT-IP:$ip");

ob_start();

$ch = curl_init();

curl_setopt ($ch, CURLOPT_URL, $url);

curl_setopt ($ch, CURLOPT_HTTPHEADER , $headers );

curl_setopt ($ch, CURLOPT_REFERER, "pay.o9di.cn");

curl_setopt( $ch, CURLOPT_HEADER, 1);

curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Linux; Android 6.0.1; OPPO R11s Build/MMB29M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/55.0.2883.91 Mobile Safari/537.36');

curl_exec($ch);

curl_close ($ch);

$out = ob_get_contents();

ob_clean();

$a = preg_match('/weixin://wap.*/',$out, $str);

if ($a) {

return substr($str[0], 0, strlen($str[0])-1);

} else {

return '';

}

}
weixin://wap/pay?prepayid%3Dwx22201221074146ac747121890095299503&package=2656135616&noncestr=1542888966&sign=e31dbc2d1231708ff8a982b15a6c7646
即为得到的deepLink值,客户端也可以通过此值直接调起支付

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340272.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

freemarker html 乱码,Freemarker生成静态html文件及中文乱码的问题.pdf

Freemarker生成静态html文件及中文乱码的问题,freemarker静态化页面,freemarker静态化,freemarker乱码,freemarker静态方法,freemarker中文乱码,freemarker网页静态化,freemarker生成word,freemarker代码生成器,freemarker生成htmlFreeMarker 允许 Java servlet 保持图形设计同…

java 泛型嵌套泛型_Java泛型简介–第6部分

java 泛型嵌套泛型这是关于泛型的介绍性讨论的延续&#xff0c; 此处的先前部分可以在此处找到。 在上一篇文章中&#xff0c;我们讨论了关于类型参数的递归边界。 我们看到了递归绑定如何帮助我们重用了车辆比较逻辑。 在该文章的结尾&#xff0c;我建议当我们不够谨慎时&…

优化自定义函数_Pandas常见的性能优化方法

文章来源于Datawhale &#xff0c;作者阿水Pandas是数据科学和数据竞赛中常见的库&#xff0c;我们使用Pandas可以进行快速读取数据、分析数据、构造特征。但Pandas在使用上有一些技巧和需要注意的地方&#xff0c;如果你没有合适的使用&#xff0c;那么Pandas可能运行速度非常…

pycharm cant open file_PyCharm

1.创建项目PyCharm是一种Python IDE.PyCharm的功能到底有多强大&#xff0c;我也说不清楚&#xff0c;今天只是介绍一下关于Pycharm创建项目的问题.✦ PyCharm可以将一个文件夹作为工程(或项目)进行打开.如图1所示&#xff0c;先创建两个文件夹(pyc1和pyc2)&#xff0c;在文件夹…

adminlte支持html5吗,spring boot:用adminlte做前端

标签(空格分隔)&#xff1a; sringboot adminlte thymeleafspring boot 和 adminlte没有紧密的联系&#xff0c;只是最近在做的一个东西用spring boot做后端用adminlte做前端&#xff0c;所以就放到spring boot系列里面讲。架构原理adminlte只是一个库&#xff0c;说不上什么框…

如何通过示例使用Java中的Exchanger

大家好&#xff0c;如果您在并发Java应用程序中工作&#xff0c;那么您可能听说过java.util.concurrent包的Exchanger类。 Java中的Exchanger是Java 1.5中与CountDownLatch &#xff0c; CyclicBarrier和Semaphores一起引入的另一个并发或同步实用程序。 顾名思义&#xff0c; …

python里写在文件的指定行_python文件操作如何写在指定的行

常常在操作文件时我们只想在某一行的插入信息&#xff0c;可以先将文件读入列表中&#xff0c;利用列表的下标插入文本&#xff0c;之后再重新写入文件。但是弊端是&#xff0c;如果文件量太大列表的性能可能不是很高。python代码&#xff1a;#codingutf-8lines[]fopen("d…

外星人跑深度学习_上海港汇外星人店,51M2020开光追和DLSS2.0畅玩《赛博朋克2077》...

上海外星人港汇恒隆广场店是外星人布局上海的首家3.0店面&#xff0c;坐落在繁华的徐家汇商圈港汇恒隆广场南座6楼。门店传承了外星人高端高品质&#xff0c;以服务客户为宗旨&#xff0c;立足上海&#xff0c;辐射周边&#xff0c;服务所有外星人客户。近日&#xff0c;让全球…

python flask html模板,python flask web开发实战 Jinja2模板

templates/index.htmlHello World!templates/user.htmlHello, {{ name }}!渲染模板&#xff1a;from flask import Flask,render_templateapp.route(/)def index():return render_template(index.html)app.route(/user/)def user(name):return render_template(user.html, name…

gwt前台开发_为GWT设置开发环境

gwt前台开发介绍 这是旨在用Java开发跨平台移动应用程序的系列文章的一部分 。 在此博客文章中&#xff0c;我们将了解GWT是什么&#xff0c;并为GWT设置开发环境。 GWT是一个开源开发工具包&#xff0c;用于开发基于浏览器的复杂Ajax应用程序。 使用GWT&#xff0c;您可以用J…

linux 释放进程res_linux内存查看及释放

查看内存常用的查看内存工具有&#xff1a;top&#xff0c;ps&#xff0c;free&#xff0c;/proc/meminfo&#xff0c;/proc/$PID/status等&#xff0c;一般都指定了虚拟内存占用情况&#xff0c;但ps或/proc/$PID/status中RSS或RSZ指定的是实际内存大小。1)freeroot:~# freeto…

js读取外部json指定字段值完整代码_前端工程化 剖析npm的包管理机制(完整版)...

导读 现如今&#xff0c;前端开发的同学已经离不开 npm 这个包管理工具&#xff0c;其优秀的包版本管理机制承载了整个繁荣发展的NodeJS社区&#xff0c;理解其内部机制非常有利于加深我们对模块开发的理解、各项前端工程化的配置以加快我们排查问题(相信不少同学收到过各种依赖…

计算机专业带给我们的启示,一次电脑网络调查带给我的启示

一次电脑网络调查带给我的启示当今世界&#xff0c;鲜有人不会上网。而许多孩子&#xff0c;也迷上了电脑。就此&#xff0c;我对周围的12个朋友做了调查。其中3人上网玩QQ&#xff0c;8人玩摩尔庄园&#xff0c;仅1人玩单机游戏。很显然&#xff0c;网络已深入孩子们的生活。做…

Apache Derby数据库JVM安全策略

抽象 我已经发布了许多有关Derby的博客&#xff1a; Derby数据库备份 同一主机上的多个Derby网络服务器 Apache Derby数据库用户和权限 与Maven和内存中Derby数据库的集成测试 这本不打算是一个系列。 但是多年来&#xff0c;我越来越多地使用Derby。 我开始使用Derby作为…

大师兄科研网vasp_怎样知道一名研究生有没有科研潜力?

原答案回答在这里了。怎么知道一名研究生有没有科研潜力&#xff1f;​www.zhihu.com大家熟悉的“员工执行力”这个词&#xff0c;其实是个伪命题&#xff0c;因为员工的执行力&#xff1d;领导的领导能力&#xff0c;领导方法得当&#xff0c;每个人都有很强的执行力。那么“学…

西交计算机专业912一样吗,西安交大912(总分404 专业课133分)经验总结

2019年西交912计算机基础经验总结(总分404 政治&#xff1a;68 英语二&#xff1a;84 数学二&#xff1a;119 专业课&#xff1a;133)先说一下个人情况吧。本人2017年毕业于西安电子科技大学计算机科学与技术专业&#xff0c;毕业以后就职于一家国企&#xff0c;奈何不安分&…

分行打印列表python_#python版一行内容分行输出

python版一行内容分行输出 1.[代码][Python]代码236091543 #python版一行内容分行输出 #依山居 18:14 2015/11/4 #题目来源 http://www.bathome.net/thread-1454-1-1.html a="aA1一bB2二cC3三dD4四eE5五fF6六gG7七hH8八iI9九" """ 分行输出为: abcdef…

机箱硬盘指示灯不亮_安钛克DF600 FLUX机箱:FLUX平台第一款机箱,为全民电竞热“降温”...

随着夏天的到来&#xff0c;电脑对散热的要求越来越高&#xff0c;特别是对于希望游戏的电竞玩家&#xff0c;不久前China Joy全球电竞大会的落幕&#xff0c;“全民电竞”这个概念再一次深入人心&#xff0c;而一名电脑主机电竞玩家&#xff0c;势必需要一款散热效果更好的机箱…

java ee maven_针对新手的Java EE7和Maven项目–第7部分

java ee maven从前面的部分恢复 第1 部分 &#xff0c; 第2 部分 &#xff0c; 第3 部分 &#xff0c; 第4 部分 &#xff0c; 第5 部分 &#xff0c; 第6部分 在上一篇文章&#xff08;第6章&#xff09;中&#xff0c;我们发现了如何使用Arquillian和Wildfly 8.1进行JPA2域模…

法在计算机课程中的应用,任务驱动法在计算机办公课程中的应用

摘 要&#xff1a;一体化教学模式中的任务驱动法是建立在建构主义教育理论基础上的一种教学法。笔者结合任务驱动法在Word2010教学中的实施过程&#xff0c;对如何应用任务驱动法展开论述。关键词&#xff1a;任务驱动法 计算机办公课程 具体应用任务驱动法就是在教学过程中&am…