近些时间也一直在研究支付这一块的东西,查看支付宝支付和微信支付的官网api,支付类型也有很多种,最简单的也是直接支付。刚开始接触微信支付,也是像大多数新手一样网上各种百度,到现在才觉得这种做法永远是事半功倍,看官方api和使用sdk要快的多。
微信支付官方文档:https://pay.weixin.qq.com/wiki/doc/api/index.html
GitHub上微信sdk下载地址:https://github.com/wxpay/WXPay-SDK-Java(一定要看sdk中readme案例)
需要准备的一些微信支付的参数appId、mchId、publicKey、appSecret,当然这些参数不需要我们程序员去关心。先不去谈实现细节,先说说微信扫码直接支付需要的大致步骤:
1.准备微信支付参数例如上面说的appId、mchId等;
2.准备待支付商品的信息,例如out_trade_no商户订单号、body商品描述、total_fee支付的金额、trade_type交易类型、notify_url通知的url(支付成功之后微信服务器请求你的项目服务器的地址)等;
3.统一下单,统一下单就是准备好这些参数之后,去请求微信的服务器,如果你的参数填写没有问题,微信服务器或返回给你一些参数信息,这些信息中就有一个参数叫做code_url,这个就是我们微信直接支付需要的东西,拿着这个code_url去生成二维码,打开微信扫一扫就能完成支付。
4.刚才我们准备了一个notify_url,当我们支付完成之后微信服务器会请求这个网址,并携带一些参数信息,这些参数信息绝大部分就是我们第2部中提交的参数信息,接下来我们在数据库中修改订单状态就行了,代表一个订单完成。
统一下单api:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1
***切记必填的参数一定要填,注意好参数的长度限制。
***微信直接支付的话trade_type为NATIVE,其他的值代表着不同的支付类型,像JSAPI代表着公众号支付(比微信直接支付稍微麻烦一点,但是原理都差不多,建议弄完微信直接支付可以去了解一下公众号支付)
***其实微信支付里面特别多的签名,但是如果我们用好sdk,根本不用担心签名的问题,别人都已经写的非常好了,这就叫站在巨人的肩膀上看的更远吧。
支付成功之后的通知:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7
好吧,上一个例子你们就更容易理解了。
1.配置类MyConfig,我们自己的config,对应的参数替换掉就可以了
import com.github.wxpay.sdk.WXPayConfig;
import java.io.*;
public class MyConfig implements WXPayConfig{
private byte[] certData;
public MyConfig() throws Exception {
String certPath = "/path/to/apiclient_cert.p12";
File file = new File(certPath);
InputStream certStream = new FileInputStream(file);
this.certData = new byte[(int) file.length()];
certStream.read(this.certData);
certStream.close();
}
public String getAppID() {
return "wx8888888888888888";
}
public String getMchID() {
return "12888888";
}
public String getKey() {
return "88888888888888888888888888888888";
}
public InputStream getCertStream() {
ByteArrayInputStream certBis = new ByteArrayInputStream(this.certData);
return certBis;
}
public int getHttpConnectTimeoutMs() {
return 8000;
}
public int getHttpReadTimeoutMs() {
return 10000;
}
}
2.统一下单:
import com.github.wxpay.sdk.WXPay;
import java.util.HashMap;
import java.util.Map;
public class WXPayExample {
public static void main(String[] args) throws Exception {
MyConfig config = new MyConfig();
WXPay wxpay = new WXPay(config);/*WXPay 是sdk中的*/
Map<String, String> data = new HashMap<String, String>();
/*
必要的参数一定要加上,没必要的参数可加可不加
*/
data.put("body", "美宜侬共享咖啡机);
data.put("out_trade_no", "2016090910595900000012");
data.put("device_info", "");
data.put("fee_type", "CNY");
data.put("total_fee", "1");
data.put("spbill_create_ip", "123.12.12.123");//这个ip可以根据用户的请求头request去获取
data.put("notify_url", "http://www.example.com/wxpay/notify");//这就是上面写的回调函数
data.put("trade_type", "NATIVE"); // 此处指定为扫码支付
data.put("product_id", "12");
try {
Map<String, String> resp = wxpay.unifiedOrder(data);//resp就是返回的全部参数
String code_url=resp.get("code_url");//这就是支付的url了
} catch (Exception e) {
e.printStackTrace();
}
}
}
最后用户支付成功之后,我们在项目中对我们先前填写的
notify_url进行拦截就行了,更改数据库中订单的状态就行。
***切记我们处理完之后,一定通知微信服务器我们处理完成了,这个在https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7里面有,如果不返回,微信服务器会隔一段时间调我们的notify_url。
大概就这么多,微信公众号支付和支付宝支付也都差不多,有时间我也会整理整理,也算是自己回顾。