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.php02 | class JsAction extends CommonAction
{ |
04 | public function index(){ |
06 | $jssdk = new JSSDK( "yourAppID" , "yourAppSecret" ); |
07 | $signPackage = $jssdk ->GetSignPackage(); |
08 | $this ->assign( 'js' , $signPackage ); |
11 | public function getPackage(){ |
12 | /**统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返回预支付订单号的接口,目前微信支付所有场景均使用这一接口 |
13 | 统一支付中以下参数从配置中获取,或由类自动生成,不需要用户填写 |
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 ; |
21 | $param [ "out_trade_no" ] = $_SESSION [ "userInfo" ][ "userID" ].time(); |
23 | $param [ "spbill_create_ip" ] = $_SERVER [ "REMOTE_ADDR" ]; |
25 | $param [ "trade_type" ] = "JSAPI" ; |
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" ; |
31 | $param [ "sign" ] = strtoupper (MD5( $signStr )); |
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> |
48 | $postObj =
simplexml_load_string( $postResult , 'SimpleXMLElement' ,
LIBXML_NOCDATA); |
50 | $msg = "" . $postObj ->return_msg; |
52 | $result [ "timestamp" ] =time(); |
53 | $result [ "nonceStr" ] = "" . $postObj ->nonce_str; //不加""拿到的是一个json对象 |
54 | $result [ "package" ] = "prepay_id=" . $postObj ->prepay_id; |
55 | $result [ "signType" ] = "MD5" ; |
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" ; |
63 | $result [ "paySign" ] = strtoupper (MD5( $paySignStr )); |
64 | $this ->ajaxReturn( $result , "" . $msg ,
1); |
66 | $this ->ajaxReturn( "" , "" . $msg ,
0); |
70 | public function callback(){ |
|
4、index.html01 | <include
file= 'Public:header' /> |
07 | <script
type= "text/javascript" > |
09 | appId: '{$js["appId"]}' , |
10 | timestamp:
{$js[ "timestamp" ]}, |
11 | nonceStr: '{$js["nonceStr"]}' , |
12 | signature: '{$js["signature"]}' , |
13 | jsApiList:
[ 'chooseWXPay' ] |
18 | document.querySelector( '#pay' ).onclick = function ()
{ |
22 | url: "__URL__/getPackage" , |
24 | success: function (data){ |
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); |
37 | if (res.errMsg == "chooseWXPay:ok" ){ |
54 | wx.error( function (res)
{ |
58 | <div
data-role= "content" > |
60 | <button
id= "pay" >支付1分钱</button> |
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;' > |
|
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_702 | < 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 > |
|
callback
<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"