用php开发app端微信支付的一点个人心得
最近因为公司需求,要开发app端上的微信支付,看了微信文档,感觉还不错,没有遇到太大的坑,需要注意的点不算太多。
写一个记事文档,作为备忘录。
app支付流程
从上面的图片中,可以看出来,需要注意的流程是一共是3部分;
第一部分:调用下单api,返回预支付订单,签名之后再返回信息(4、5、6、7)
第二部分:异步通知(15、16)
第三部分:最后的判断支付结果
最需要注意的就是第一部分:调用下单api,返回预支付订单,签名之后再返回信息
中有详细的说明,这里不再赘述。
附录一下我的代码,伸手党,稍微改点代码就可以用了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
//入口函数
function wechatpay(){
$json = array ();
//生成预支付交易单的必选参数:
$newpara = array ();
//应用id
$newpara [ "appid" ] = "wx2421b1c4370ec43b" ;
//商户号
$newpara [ "mch_id" ] = "10000100" ;
//设备号
$newpara [ "device_info" ] = "web" ;
//随机字符串,这里推荐使用函数生成
$newpara [ "nonce_str" ] = "1add1a30ac87aa2db72f57a2375d8fec" ;
//商品描述
$newpara [ "body" ] = "app支付测试" ;
//商户订单号,这里是商户自己的内部的订单号
$newpara [ "out_trade_no" ] = "1415659990" ;
//总金额
$newpara [ "total_fee" ] = 1;
//终端ip
$newpara [ "spbill_create_ip" ] = $_server [ "remote_addr" ];
//通知地址,注意,这里的url里面不要加参数
$newpara [ "notify_url" ] = "http://wxpay.wxutil.com/pub_v2/pay/notify.v2.php" ;
//交易类型
$newpara [ "trade_type" ] = "app" ;
//第一次签名
$newpara [ "sign" ] = producewechatsign( $newpara );
//把数组转化成xml格式
$xmldata = getwechatxml( $newpara );
//利用php的curl包,将数据传给微信统一下单接口,返回正常的prepay_id
$get_data = sendprepaycurl( $xmldata );
//返回的结果进行判断。
if ( $get_data [ 'return_code' ] == "success" && $get_data [ 'result_code' ] == "success" ){
//根据微信支付返回的结果进行二次签名
//二次签名所需的随机字符串
$newpara [ "nonce_str" ] = "5k8264iltkch16cq2502si8znmtm67vs" ;
//二次签名所需的时间戳
$newpara [ 'timestamp' ] = time(). "" ;
//二次签名剩余参数的补充
$secondsignarray = array (
"appid" => $newpara [ 'appid' ],
"noncestr" => $newpara [ 'nonce_str' ],
"package" => "sign=wxpay" ,
"prepayid" => $get_data [ 'prepay_id' ],
"partnerid" => $newpara [ 'mch_id' ],
"timestamp" => $newpara [ 'timestamp' ],
);
$json [ 'datas' ] = $secondsignarray ;
$json [ 'ordersn' ] = $newpara [ "out_trade_no" ];
$json [ 'datas' ][ 'sign' ] = wechatsecondsign( $newpara , $get_data [ 'prepay_id' ]);
$json [ 'message' ] = "预支付完成" ;
//预支付完成,在下方进行自己内部的业务逻辑
/*****************************/
return json_encode( $json );
}
else {
$json [ 'message' ] = $get_data [ 'return_msg' ];
}
}
return json_encode( $json );
}
//第一次签名的函数producewechatsign
function producewechatsign( $newpara ){
$stringa = self::getsigncontent( $newpara );
$stringsigntemp = $stringa . "&key=192006250b4c09247ec02edce69f6a2d" ;
return strtoupper (md5( $stringsigntemp ));
}
//生成xml格式的函数
public static function getwechatxml( $newpara ){
$xmldata = "<xml>" ;
foreach ( $newpara as $key => $value ) {
$xmldata = $xmldata . "<" . $key . ">" . $value . "</" . $key . ">" ;
}
$xmldata = $xmldata . "</xml>" ;
return $xmldata ;
}
//通过curl发送数据给微信接口的函数
function sendprepaycurl( $xmldata ) {
$url = "https://api.mch.weixin.qq.com/pay/unifiedorder" ;
$header [] = "content-type: text/xml" ;
$curl = curl_init();
curl_setopt( $curl , curlopt_httpheader, $header );
curl_setopt( $curl , curlopt_url, $url );
curl_setopt( $curl , curlopt_returntransfer, true);
curl_setopt( $curl , curlopt_post, 1);
curl_setopt( $curl , curlopt_postfields, $xmldata );
$data = curl_exec( $curl );
if (curl_errno( $curl )) {
print curl_error( $curl );
}
curl_close( $curl );
return self::xmldataparse( $data );
}
//xml格式数据解析函数
public static function xmldataparse( $data ){
$msg = array ();
$msg = ( array )simplexml_load_string( $data , 'simplexmlelement' , libxml_nocdata);
return $msg ;
}
//二次签名的函数
function wechatsecondsign( $newpara , $prepay_id ){
$secondsignarray = array (
"appid" => $newpara [ 'appid' ],
"noncestr" => $newpara [ 'nonce_str' ],
"package" => "sign=wxpay" ,
"prepayid" => $prepay_id ,
"partnerid" => $newpara [ 'mch_id' ],
"timestamp" => $newpara [ 'timestamp' ],
);
$stringa = self::getsigncontent( $secondsignarray );
$stringsigntemp = $stringa . "&key=192006250b4c09247ec02edce69f6a2d" ;
return strtoupper (md5( $stringsigntemp ));
}
|
两个注意点:
1.二次签名需要在后台完成,并且完成之后,连带着二次签名所用的所有信息一起传给前端,让前段唤起微信支付。这样不容易出现没法吊起微信支付的情况。
2.两次签名,用的是不同的随机字符串。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。