微信JS-SDK官方支付接口在THINKPHP中使用
来源:互联网 发布:三国志9需要优化哪些 编辑:程序博客网 时间:2024/05/16 09:58
1、下载demo
进入微信JS-SDK说明文档http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html
在页面底部下载demo
2、将demo中的文件放入ThinkPHP中
进入sample/php,除了sample.php其余全部放入ThinkPHP项目的Common中
打开sample.php可以看到是php和html组合的,我按照ThinkPHP的写法将sample.php拆成一个Action和一个html模版文件
3、直接贴代码JsAction.class.php
4、index.html
Common/jssdk.php代码包括了获取 access_token 和 jsapi_ticket 的操作,只需传入 appid 和 appsecret 即可,获取 access_token 部分代码从全局缓存中获取,防止重复获取 access_token ,超过调用频率。
应注意access_token.json和jsapi_ticket.json路径
callback
进入微信JS-SDK说明文档http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html
在页面底部下载demo
2、将demo中的文件放入ThinkPHP中
进入sample/php,除了sample.php其余全部放入ThinkPHP项目的Common中
打开sample.php可以看到是php和html组合的,我按照ThinkPHP的写法将sample.php拆成一个Action和一个html模版文件
3、直接贴代码JsAction.class.php
01
<?php
02
class
JsAction
extends
CommonAction {
03
04
public
function
index(){
05
load (
"@.jssdk"
);
06
$jssdk
=
new
JSSDK(
"yourAppID"
,
"yourAppSecret"
);
07
$signPackage
=
$jssdk
->GetSignPackage();
08
$this
->assign(
'js'
,
$signPackage
);
09
$this
->display();
10
}
11
public
function
getPackage(){
12
/**统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返回预支付订单号的接口,目前微信支付所有场景均使用这一接口
13
统一支付中以下参数从配置中获取,或由类自动生成,不需要用户填写
14
微信支付统一下单接口文档:http://pay.weixin.qq.com/wiki/doc/api/index.php?chapter=9_1*/
15
$rand
= md5(time() . mt_rand(0,1000));
16
$param
[
"appid"
] =
"yourAppSecret"
;
17
$param
[
"openid"
] =
$_SESSION
[
"userInfo"
][
"wxID"
];
18
$param
[
"mch_id"
] =
"商户ID"
;
19
$param
[
"nonce_str"
] =
$rand
;
20
$param
[
"body"
] =
"测试支付"
;
21
$param
[
"out_trade_no"
] =
$_SESSION
[
"userInfo"
][
"userID"
].time();
22
$param
[
"total_fee"
] = 1;
23
$param
[
"spbill_create_ip"
] =
$_SERVER
[
"REMOTE_ADDR"
];
24
$param
[
"notify_url"
] =
"http://www.xxx.com/xxx.php/Js/callback"
;
25
$param
[
"trade_type"
] =
"JSAPI"
;
26
27
//签名算法:http://pay.weixin.qq.com/wiki/doc/api/index.php?chapter=4_3
28
$signStr
=
'appid='
.
$param
[
"appid"
].
"&body="
.
$param
[
"body"
].
"&mch_id="
.
$param
[
"mch_id"
].
"&nonce_str="
.
$param
[
"nonce_str"
].
"¬ify_url="
.
$param
[
"notify_url"
].
"&openid="
.
$param
[
"openid"
].
"&out_trade_no="
.
$param
[
"out_trade_no"
].
"&spbill_create_ip="
.
$param
[
"spbill_create_ip"
].
"&total_fee="
.
$param
[
"total_fee"
].
"&trade_type="
.
$param
[
"trade_type"
];
29
$signStr
=
$signStr
.
"&key=youAPIkey"
;
30
31
$param
[
"sign"
] =
strtoupper
(MD5(
$signStr
));
32
33
$data
= '<xml>
34
<appid><![CDATA[
'.$param["appid"].'
]]></appid>
35
<openid><![CDATA[
'.$param["openid"].'
]]></openid>
36
<mch_id>
'.$param["mch_id"].'
</mch_id>
37
<nonce_str><![CDATA[
'.$param["nonce_str"].'
]]></nonce_str>
38
<body><![CDATA[
'.$param["body"].'
]]></body>
39
<out_trade_no><![CDATA[
'.$param["out_trade_no"].'
]]></out_trade_no>
40
<total_fee>
'.$param["total_fee"].'
</total_fee>
41
<spbill_create_ip><![CDATA[
'.$param["spbill_create_ip"].'
]]></spbill_create_ip>
42
<notify_url><![CDATA[
'.$param["notify_url"].'
]]></notify_url>
43
<trade_type><![CDATA[
'.$param["trade_type"].'
]]></trade_type>
44
<sign><![CDATA[
'.$param["sign"].'
]]></sign>
45
</xml>';
46
47
$postResult
= myCurl(
"https://api.mch.weixin.qq.com/pay/unifiedorder"
,
$data
);
48
$postObj
= simplexml_load_string(
$postResult
,
'SimpleXMLElement'
, LIBXML_NOCDATA);
49
50
$msg
=
""
.
$postObj
->return_msg;
51
if
(
$msg
==
"OK"
){
52
$result
[
"timestamp"
] = time();
53
$result
[
"nonceStr"
] =
""
.
$postObj
->nonce_str;
//不加""拿到的是一个json对象
54
$result
[
"package"
] =
"prepay_id="
.
$postObj
->prepay_id;
55
$result
[
"signType"
] =
"MD5"
;
56
57
/**支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
58
备注:prepay_id 通过微信支付统一下单接口拿到,paySign 采用统一的微信支付 Sign 签名生成方法,注意这里 appId 也要参与签名,
59
appId 与 config 中传入的 appId 一致,即最后参与签名的参数有appId, timeStamp, nonceStr, package, signType。*/
60
$paySignStr
=
'appId=wxd7c487b7a2d9bc65'
.
'&nonceStr='
.
$result
[
"nonceStr"
].
'&package='
.
$result
[
"package"
].
'&signType='
.
$result
[
"signType"
].
'&timeStamp='
.
$result
[
"timestamp"
];
61
$paySignStr
=
$paySignStr
.
"&key=youAPIkey"
;
62
63
$result
[
"paySign"
] =
strtoupper
(MD5(
$paySignStr
));
64
$this
->ajaxReturn(
$result
,
""
.
$msg
, 1);
65
}
else
{
66
$this
->ajaxReturn(
""
,
""
.
$msg
, 0);
67
}
68
}
69
70
public
function
callback(){
71
72
}
73
}
4、index.html
01
<include file=
'Public:header'
/>
02
03
</head>
04
<body>
05
<div data-role=
"page"
>
06
<script src=
"http://res.wx.qq.com/open/js/jweixin-1.0.0.js"
></script>
07
<script type=
"text/javascript"
>
08
wx.config({
09
appId:
'{$js["appId"]}'
,
10
timestamp: {$js[
"timestamp"
]},
11
nonceStr:
'{$js["nonceStr"]}'
,
12
signature:
'{$js["signature"]}'
,
13
jsApiList: [
'chooseWXPay'
]
14
});
15
16
wx.ready(
function
() {
17
18
document.querySelector(
'#pay'
).onclick =
function
() {
19
showLoad();
20
$.ajax({
21
type:
"POST"
,
22
url:
"__URL__/getPackage"
,
23
data:{},
24
success:
function
(data){
25
hideLoad();
26
if
(data.status==1){
27
wx.chooseWXPay({
28
timestamp: data.data.timestamp,
// 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
29
nonceStr: data.data.nonceStr,
// 支付签名随机串,不长于 32 位
30
package: data.data.package,
// 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***)
31
signType: data.data.signType,
// 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
32
paySign: data.data.paySign,
// 支付签名
33
success:
function
(res) {
34
var
str = JSON.stringify(res);
35
// 支付成功后的回调函数
36
alert(str);
37
if
(res.errMsg ==
"chooseWXPay:ok"
){
38
alert(
"支付成功!"
);
39
}
else
{
40
alert(
"支付失败!"
);
41
}
42
}
43
});
44
}
else
{
45
show_msg(data.info);
46
}
47
}
48
49
});
50
};
51
52
});
53
54
wx.error(
function
(res) {
55
alert(res.errMsg);
56
});
57
</script>
58
<div data-role=
"content"
>
59
60
<button id=
"pay"
>支付1分钱</button>
61
</div>
62
63
<div data-role=
"popup"
id=
"info_pop"
class=
"ui-content"
data-theme=
"d"
style=
'font-weight:bold;font-size:14px; z-index: 99999; background-color: white;'
>
64
<p>未知错误</p>
65
</div>
66
</div>
67
</body>
68
</html>
Common/jssdk.php代码包括了获取 access_token 和 jsapi_ticket 的操作,只需传入 appid 和 appsecret 即可,获取 access_token 部分代码从全局缓存中获取,防止重复获取 access_token ,超过调用频率。
应注意access_token.json和jsapi_ticket.json路径
5、支付通知
支付成功后,通知接口中也将收到支付成功的xml通知
支付结果通用通知http://pay.weixin.qq.com/wiki/doc/api/index.php?chapter=9_7
01
<
xml
>
02
<
appid
>
<![CDATA[wx8888888888888888]]>
</
appid
>
03
<
bank_type
>
<![CDATA[CFT]]>
</
bank_type
>
04
<
fee_type
>
<![CDATA[CNY]]>
</
fee_type
>
05
<
is_subscribe
>
<![CDATA[Y]]>
</
is_subscribe
>
06
<
mch_id
>
<![CDATA[10012345]]>
</
mch_id
>
07
<
nonce_str
>
<![CDATA[60uf9sh6nmppr9azveb2bn7arhy79izk]]>
</
nonce_str
>
08
<
openid
>
<![CDATA[ou9dHt0L8qFLI1foP-kj5x1mDWsM]]>
</
openid
>
09
<
out_trade_no
>
<![CDATA[wx88888888888888881414411779]]>
</
out_trade_no
>
10
<
result_code
>
<![CDATA[SUCCESS]]>
</
result_code
>
11
<
return_code
>
<![CDATA[SUCCESS]]>
</
return_code
>
12
<
sign
>
<![CDATA[0C1D7F2534F1473247550A5A138F0CEB]]>
</
sign
>
13
<
sub_mch_id
>
<![CDATA[10012345]]>
</
sub_mch_id
>
14
<
time_end
>
<![CDATA[20141027200958]]>
</
time_end
>
15
<
total_fee
>1</
total_fee
>
16
<
trade_type
>
<![CDATA[JSAPI]]>
</
trade_type
>
17
<
transaction_id
>
<![CDATA[1002750185201410270005514026]]>
</
transaction_id
>
18
</
xml
>
<span style="white-space:pre"></span>$postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); $weChatOrder = $postObj->transaction_id.""; //微信返回的微信订单号 $weOrder = $postStr->out_trade_no.""; //微信返回的用户订单号 $status = $postStr->return_code."";//$stauts = "SUCCESS"
0 0
- 微信JS-SDK官方支付接口在THINKPHP中使用
- 官方教程:教你用好微信JS-SDK接口
- 微信支付官方SDK调通
- 微信支付接口-银行官方通道
- 微信网页支付jsapi传参问题解决(使用微信官方SDK)
- 微信公众号支付 使用基于thinkphp 使用微信官网的sdk
- 微信JS-SDK接口
- 微信js-sdk接口
- 微信JS-SDK 接口
- 微信支付-扫码支付方式在ThinkPHP商城中的使用(第一部分)
- 微信支付-扫码支付方式在ThinkPHP商城中的使用(第二部分)
- 微信支付-扫码支付方式在ThinkPHP商城中的使用(第三部分)
- thinkphp微信支付
- 微信JS SDK Demo 官方案例
- 微信JS SDK Demo 官方案例
- 微信支付的使用(微信支付SDK)
- 微信 js-sdk 界面操作接口使用
- 微信支付官方SDK-phpV3的一处坑
- dedecms 开发点赞功能
- android中 欢迎界面的实现
- Python函数参数的传递
- Android中Application类用法
- POJ2299 Ultra-QuickSort
- 微信JS-SDK官方支付接口在THINKPHP中使用
- leetcode:Partition List
- Linear models for regresion(回归)
- 同一时间内相同程序只运行一个进程运行
- UDP可靠传输,VTCP和UDX协议比较
- 判断点是否在视景体内的参考资料
- 观察者模式
- apache中虚拟目录总是403 Forbidden的问题
- 虚拟浏览器(WebClient)应用简单例子