微信支付开发(1) JS API支付

From: http://www.cnblogs.com/txw1958/p/wxpayv3-jsapi.html


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

 

本文介绍微信支付下的jsapi实现流程

前言

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

流程实现

1. OAuth2.0授权

JSAPI 支付前需要调用 登录授权接口获取到用户的 Openid 。所以需要做一次授权,这次授权是不弹出确认框的。
其实质就是在用户访问

http://www.fangbei.org/wxpay/js_api_call.php

时跳转到

https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx8888888888888888&redirect_uri=http://www.fangbei.org/wxpay/js_api_call.php&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect

以此来获得code参数,并根据code来获得授权access_token及openid

其实现的详细流程可参考 微信公众平台开发(71)OAuth2.0网页授权

在微信支付的Demo中,其代码为

复制代码
 1 //使用jsapi接口
 2 $jsApi = new JsApi_pub();
 3 
 4 //=========步骤1:网页授权获取用户openid============
 5 //通过code获得openid
 6 if (!isset($_GET['code']))
 7 {
 8     //触发微信返回code码
 9     $url = $jsApi->createOauthUrlForCode(WxPayConf_pub::JS_API_CALL_URL);
10     Header("Location: $url"); 
11 }else
12 {
13     //获取code码,以获取openid
14     $code = $_GET['code'];
15     $jsApi->setCode($code);
16     $openid = $jsApi->getOpenId();
17 }
复制代码

这一步的最终结果就是获得了当前用户的openid

ou9dHt0L8qFLI1foP-kj5x1mDWsM

 

2. 统一支付

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返回预支付订单号的接口,目前微信支付所有场景均使用这一接口
统一支付中以下参数从配置中获取,或由类自动生成,不需要用户填写

$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);//签名

在JSAPI支付中,另外填写以下参数

复制代码
//统一支付接口中,trade_type为JSAPI时,openid为必填参数!
$unifiedOrder->setParameter("openid","$openid");//商品描述
$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","JSAPI");//交易类型
复制代码

其他为选填参数

复制代码
//非必填参数,商户可根据实际情况选填
//$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");//用户标识
//$unifiedOrder->setParameter("product_id","XXXX");//商品ID
复制代码

这些参数最终组成了这样的xml数据,

复制代码
<xml><openid><![CDATA[ou9dHt0L8qFLI1foP-kj5x1mDWsM]]></openid><body><![CDATA[方倍工作室]]></body><out_trade_no><![CDATA[wx88888888888888881414411779]]></out_trade_no><total_fee>1</total_fee><notify_url><![CDATA[http://www.fangbei.org/wxpay/notify_url.php]]></notify_url><trade_type><![CDATA[JSAPI]]></trade_type><appid><![CDATA[wx8888888888888888]]></appid><mch_id>10012345</mch_id><spbill_create_ip><![CDATA[61.50.221.43]]></spbill_create_ip><nonce_str><![CDATA[60uf9sh6nmppr9azveb2bn7arhy79izk]]></nonce_str><sign><![CDATA[2D8A96553672D56BB2908CE4B0A23D0F]]></sign>
</xml>
复制代码

将这些数据提交给统一支付接口

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

将获得返回 如下数据

复制代码
<xml><return_code><![CDATA[SUCCESS]]></return_code>  <return_msg><![CDATA[OK]]></return_msg>  <appid><![CDATA[wx8888888888888888]]></appid>  <mch_id><![CDATA[10012345]]></mch_id>  <nonce_str><![CDATA[Be8YX7gjCdtCT7cr]]></nonce_str>  <sign><![CDATA[885B6D84635AE6C020EF753A00C8EEDB]]></sign>  <result_code><![CDATA[SUCCESS]]></result_code>  <prepay_id><![CDATA[wx201410272009395522657a690389285100]]></prepay_id>  <trade_type><![CDATA[JSAPI]]></trade_type> 
</xml>
复制代码

其中包含了最重要的预支付ID参数,prepay_id,值为 

wx201410272009395522657a690389285100

 

3、JS API支付

前面的准备工作做好了以后,JS API根据prepay_id生成jsapi支付参数
生成代码如下

//=========步骤3:使用jsapi调起支付============
$jsApi->setPrepayId($prepay_id);
$jsApiParameters = $jsApi->getParameters();

生成的json数据如下

复制代码
{"appId": "wx8888888888888888","timeStamp": "1414411784","nonceStr": "gbwr71b5no6q6ne18c8up1u7l7he2y75","package": "prepay_id=wx201410272009395522657a690389285100","signType": "MD5","paySign": "9C6747193720F851EB876299D59F6C7D"
}
复制代码

在微信浏览器中调试起js接口,代码如下

复制代码
<html>
<head><meta http-equiv="content-type" content="text/html;charset=utf-8"/><title>微信安全支付</title><script type="text/javascript">//调用微信JS api 支付function jsApiCall(){WeixinJSBridge.invoke('getBrandWCPayRequest',<?php echo $jsApiParameters; ?>,function(res){WeixinJSBridge.log(res.err_msg);//alert(res.err_code+res.err_desc+res.err_msg);
                });}function callpay(){if (typeof WeixinJSBridge == "undefined"){if( document.addEventListener ){document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);}else if (document.attachEvent){document.attachEvent('WeixinJSBridgeReady', jsApiCall); document.attachEvent('onWeixinJSBridgeReady', jsApiCall);}}else{jsApiCall();}}</script>
</head>
<body></br></br></br></br><div align="center"><button style="width:210px; height:30px; background-color:#FE6714; border:0px #FE6714 solid; cursor: pointer;  color:white;  font-size:16px;" type="button" onclick="callpay()" >贡献一下</button></div>
</body>
</html>
复制代码

当用户点击“贡献一下”按钮时,将弹出微信支付插件,用户可以开始支付。

 

4、支付通知

支付成功后,通知接口中也将收到支付成功的xml通知

复制代码
<xml><appid><![CDATA[wx8888888888888888]]></appid>  <bank_type><![CDATA[CFT]]></bank_type>  <fee_type><![CDATA[CNY]]></fee_type>  <is_subscribe><![CDATA[Y]]></is_subscribe>  <mch_id><![CDATA[10012345]]></mch_id>  <nonce_str><![CDATA[60uf9sh6nmppr9azveb2bn7arhy79izk]]></nonce_str>  <openid><![CDATA[ou9dHt0L8qFLI1foP-kj5x1mDWsM]]></openid>  <out_trade_no><![CDATA[wx88888888888888881414411779]]></out_trade_no>  <result_code><![CDATA[SUCCESS]]></result_code>  <return_code><![CDATA[SUCCESS]]></return_code>  <sign><![CDATA[0C1D7F2534F1473247550A5A138F0CEB]]></sign>  <sub_mch_id><![CDATA[10012345]]></sub_mch_id>  <time_end><![CDATA[20141027200958]]></time_end>  <total_fee>1</total_fee>  <trade_type><![CDATA[JSAPI]]></trade_type>  <transaction_id><![CDATA[1002750185201410270005514026]]></transaction_id> 
</xml>
复制代码

notify_url收到以后,再返回确认成功消息给微信服务器

<xml><return_code><![CDATA[SUCCESS]]></return_code>
</xml>

 

 

演示与源代码

演示地址,微信扫描下方二维码支付1分钱体验

我们提供已修复bug并调通的微信支付V3版Demo,费用100元。需要技术指导+源码一共300元。

联系QQ 1354386063。

 

服务项目技术咨询微信图书微信视频微信代码定制开发其他福利
服务入口QQ群有问必答
查看详情
一本书解决90%问题
查看详情
微信开发视频
小程序开发视频
免费代码

QQ:1354386063
营销工具
淘宝内部优惠折扣精选

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

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

相关文章

Find命令使用详解

Find命令使用详解 Find是Linux中查找文件的命令&#xff0c;“find”命令能帮助我们在使用,管理Linux的日常事务中方便的查找出我们需要的文件。Find 命令的特点&#xff1a;实时、精确、支持众多查找标准、遍历指定目录中的所有文件完成查找&#xff0c;速度慢&#xff1b;Fin…

el-upload多文件上传;el-upload采用递归依次上传文件;el-upload采用递归在上一个文件上传成功后再传下一个文件

场景&#xff1a; 需求是接口一次上传一个文件&#xff0c;前一个文件上传成功后再调下一个接口上传下一个文件。 el-upload本身就支持多文件上传。但是它是并发进行&#xff0c;例如&#xff1a;选择一千个文件后&#xff0c;是一千个文件自动立马并行调用一千个后端接口去上传…

昨天事情还是比较多,让我晚上加了会班

今天早上睡的有点沉&#xff0c;然后昨天晚上也是睡的早10&#xff1a;00 转载于:https://www.cnblogs.com/bkchengzheng/p/5891271.html

.Net (C#)委托和事件(获取多个返回值)

From: http://www.xuebuyuan.com/841530.html 在讲如何获取多个返回值之前先来看一个小例子&#xff1a; private void button1_Click(object sender, EventArgs e) { int Number 200; //设置Number的值为 200。 Publishser pub new…

el-dialog点击弹框外区域不关闭弹框;

el-dialog正常点击弹框外区域是关闭弹框&#xff0c;如若不想关闭弹框&#xff0c;设置如下属性即可&#xff1a; :close-on-click-modal"false"

Xen的起源与工作原理

如今&#xff0c;虚拟化市场上满是各种不同的虚拟化解决方案。多年以来&#xff0c;VMware一直控制着基于i386的虚拟化市场。然而&#xff0c;现在的开源解决方案Xen也 在迅速地扩张自己的市场。在本文中&#xff0c;TechTarget中国的特约虚拟化专家Sander van Vugt将介绍什么是…

男女完全匹配算法

#include<iostream> #include<String> #include"Free_W_M_Stack.cpp" using namespace std; int Number1(string elem, string A[], int n){//返回某个人的匹配号for (int i 0; i < n; i){if (elem A[i])return i;}return -1; } int main(){int n;/…

监听el-dialog关闭弹窗事件;el-dialog注册@close关闭事件

场景&#xff1a;在关闭el-dialog弹框时候&#xff0c;做数据清空。只需要给el-dialog注册close关闭事件即可&#xff1a; <el-dialog title"标题" :visible.sync"bind" size"small" closecloseDialog> </el-dialog>//关闭弹框的事件…

手机游戏赚钱到底有多难?接入运营商或需一年

假如你是一个手机游戏创业者&#xff0c;假如你想赚钱&#xff0c;亲&#xff0c;请先与运营商搞好关系&#xff0c;或者&#xff0c;请找一个有SP经验或者熟悉手机游戏审批流程的合作伙伴&#xff0c;否则&#xff0c;等待你的将是甚至长达一年的审批期。 先来讲讲我为何要写这…

总是骗人的你

从这周来&#xff0c;就一直在和周围的人说着要结束实习。到现在&#xff0c;也没有办法办理离职。我现在已经看不起自己了&#xff0c;我已经成为我当初讨厌的人&#xff0c;嘴里一直嚷嚷着&#xff0c;却一直都做不到。还不停的给周围的人说&#xff0c;我想&#xff0c;这种…

Controller向View传值方式总结

From: http://www.cnblogs.com/guohu/p/4377974.html 总结发现ASP.NET MVC中Controller向View传值的方式共有6种&#xff0c;分别是&#xff1a; ViewBagViewDataTempData向普通View页面传一个Model对象向强类型页面传传一个Model对象用一个ViewModel对象解决所有问题 首先我们…

el-table-column动态显示与隐藏

两个不同条件下共用一个el-table表格&#xff0c;并且通过v-if控制某一列的显示与否。 若不生效&#xff0c;则按照如下设置。 ​​​​​​​<el-table-column v-if"undo" label"xxxx" prop"xx" min-width"110" show-overflow-too…

重装系统后,快盘不能拷贝进文件的解决办法

给对应账号的的虚拟磁盘文件&#xff0c;添加"Authenticated Users"账户的权限

记录一次bug解决过程:数据迁移

一 总结不擅长语言表达&#xff0c;勤于沟通&#xff0c;多锻炼 调试MyBatis中SQL语法:foreach 问题&#xff1b;缺少关键字VALUES。很遗憾&#xff1a;它的错误报的让人找不着北。 二 BUG描述&#xff1a;MyBatis中批量插入数据异常 <?xml version"1.0" encodin…

el-tabs标签页浏览器卡死;使用el-tab-pane浏览器卡死;element-ui使用el-tab-pane浏览器卡死,el-tab,el-tab-pane版本不兼容

在项目中使用了el-tabs标签页卡死&#xff0c;一直刷新加载中 出现该问题的原因主要是版本不兼容的问题 首先找到package.json&#xff0c;将以下vue版本修改为2.6.0&#xff0c;element-ui版本修改为2.13.2&#xff1a; “element-ui”: “2.13.2” “vue”: “2.6.0” “vue-…

.net 获取网站根目录的方法

From: http://www.cnblogs.com/wenbo/archive/2011/08/09/2132620.html 获取网站根目录的方法有几种如&#xff1a; Server.MapPath(Request.ServerVariables["PATH_INFO"])    Server.MapPath("/")    Server.MapPath("")//当前代码文件所在…

2013年3月16日星期六

今天第11周&#xff0c;本来是双休&#xff0c;结果要加班&#xff0c;本来要加班写详细设计结果被做画面自适应解决现场问题。本来想回来一个人安静写详细设计&#xff0c;结果却一直在看电影聊天&#xff0c;似乎回来后就不能控制自己了&#xff0c;有点痛苦

繁华模拟赛 ljw分雕塑

/* 用f[i][k]表示考虑到第i个雕塑&#xff0c;分成k组&#xff0c;可不可行&#xff08;这是一个bool类型的数组&#xff09; 转移&#xff1a; f[i][k]f[j][k-1],sum[i]-sum[j]合法 */ #include <cstdio> #include <cstdlib> #include <cstring> #include &…

el-table滚动加载数据;vue自定义指令监听el-table的滚动事件,达到滚动条滚动到底部加载新数据

首先在vue项目中的main.js文件添加一个监听el-table滚动条事件的自定义指令&#xff0c;以供全局使用 // 监听el-table滚动 Vue.directive(loadmore, {bind(el, binding) {const selectWrap el.querySelector(.el-table__body-wrapper)selectWrap.addEventListener(scroll, fu…

PHPMailer - PHP email transport class

在服务器安装 sendmail sudo apt-get install sendmail启动 sendmailsudo /etc/init.d/sendmail start 修改 php.ini [mail function] SMTP localhost smtp_port 25 sendmail_from meexample.com Function sendMail <?php /* 调用PHPMailer发送电邮 * param String $r…