目录:
移动大脑-SpringMVc搭建RestFul后台服务(一)-环境搭建
移动大脑-SpringMVc搭建RestFul后台服务(二)-配置mysql数据库
移动大脑-SpringMVc搭建RestFul后台服务(三)-RestFul接口编写(模拟用户注册登录)
移动大脑-SpringMVc搭建RestFul后台服务(四)-添加Token过滤器
移动大脑-SpringMVc搭建RestFul后台服务(五)-支付宝支付
移动大脑-SpringMVc搭建RestFul后台服务(六)-微信支付(Android)
在上一篇《移动大脑-SpringMVc搭建RestFul后台服务(五)-支付宝支付》博客中已经实现了支付宝支付,接下来我满再添加微信支付功能,这样支付功能基本就完整了,银联就不考虑了 。
原来我写过一篇《Android微信支付爬坑》的博客,里面讲的就是完全从APP端发起的支付,有需要的可以看看。
先来张实例图:
首先开始准备工作,在微信开发平台(https://open.weixin.qq.com/)申请自己的应用,并填写正确的包名和签名,审核通过后再申请微信支付功能,此时或得到商户账号,并在商户后台设置自己的32位key,以上都准备好后,并下载所需要的微信开发jar包(主要是生成签名和网络访问的工具类,可根据自己情况来改成自己的工具类),就可以开始微信的开发了。
微信支付流程和支付宝其实也是一样的:APP请求服务端支付接口---->服务端生成本地订单---->服务端构造数据到微信端生成预支付订单---->服务端拿到预支付订单返回给APP---->APP拿到微信支付信息调起微信支付---->微信支付成功通过通知APP---->微信异步调用服务端支付验证接口---->服务端处理验证结果返回给微信,就完成了一次支付过程。
开始编码:
一、在PaySerVice中添加微信下单
- else if(payWay == 2)//微信支付
- {
- SortedMap<String, String> parameters = new TreeMap<String, String>();
- parameters.put("appid", WX_APPID);
- parameters.put("body", orderBean.getSubject());
- parameters.put("mch_id", WX_MCHID);
- parameters.put("nonce_str", CommonUtils.genNonceStr());
- parameters.put("notify_url", "http://10.50.50.205:8080/pay/verifywxpayresult.do");
- parameters.put("out_trade_no", orderBean.getOrderNo());
- parameters.put("total_fee", "50");
- parameters.put("trade_type", "APP");
- parameters.put("spbill_create_ip", "196.168.1.1");
- parameters.put("sign", CommonUtils.createSign("UTF-8", parameters, WX_KEY)); //传入签名好的参数值
- StringBuilder xmlBuilder = new StringBuilder();
- xmlBuilder.append("<xml>");
- Set es = parameters.entrySet();//所有参与传参的参数按照accsii排序(升序)
- Iterator it = es.iterator();
- CommonUtils.createXml(it, xmlBuilder);
- xmlBuilder.append("</xml>");
- System.out.println(xmlBuilder.toString());
- try {
- String url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
- byte[] buf = Util.httpPost(url, new String(xmlBuilder.toString().getBytes("UTF-8"), "ISO8859-1"));
- String content = new String(buf);
- System.out.println("content:" + content);
- Map<String, String> map = CommonUtils.xmlToMap(content);
- String nonceStr = CommonUtils.genNonceStr();
- String timeStamp = String.valueOf(CommonUtils.genTimeStamp());
- SortedMap<String, String> signparameters = new TreeMap<String, String>();
- signparameters.put("appid", map.get( "appid"));
- signparameters.put("partnerid", map.get( "mch_id"));
- signparameters.put("prepayid", map.get( "prepay_id"));
- signparameters.put("package", "Sign=WXPay");
- signparameters.put("noncestr", nonceStr);
- signparameters.put("timestamp", timeStamp);
- wxPayBean = new WxPayBean();
- wxPayBean.setOrderId(order.getOrderNo());
- wxPayBean.setAppid(map.get("appid"));
- wxPayBean.setPartnerid(map.get("mch_id"));
- wxPayBean.setPrepayid(map.get("prepay_id"));
- wxPayBean.setNoncestr(nonceStr);
- wxPayBean.setTimestamp(timeStamp);
- wxPayBean.setPackageValue("Sign=WXPay");
- wxPayBean.setSign(CommonUtils.createSign("UTF-8", signparameters, WX_KEY));
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
else if(payWay == 2)//微信支付
{
SortedMap<String, String> parameters = new TreeMap<String, String>();
parameters.put("appid", WX_APPID);
parameters.put("body", orderBean.getSubject());
parameters.put("mch_id", WX_MCHID);
parameters.put("nonce_str", CommonUtils.genNonceStr());
parameters.put("notify_url", "http://10.50.50.205:8080/pay/verifywxpayresult.do");
parameters.put("out_trade_no", orderBean.getOrderNo());
parameters.put("total_fee", "50");
parameters.put("trade_type", "APP");
parameters.put("spbill_create_ip", "196.168.1.1");
parameters.put("sign", CommonUtils.createSign("UTF-8", parameters, WX_KEY));//传入签名好的参数值
StringBuilder xmlBuilder = new StringBuilder();
xmlBuilder.append("<xml>");
Set es = parameters.entrySet();//所有参与传参的参数按照accsii排序(升序)
Iterator it = es.iterator();
CommonUtils.createXml(it, xmlBuilder);
xmlBuilder.append("</xml>");
System.out.println(xmlBuilder.toString());
try {
String url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
byte[] buf = Util.httpPost(url, new String(xmlBuilder.toString().getBytes("UTF-8"), "ISO8859-1"));
String content = new String(buf);
System.out.println("content:" + content);
Map<String, String> map = CommonUtils.xmlToMap(content);
String nonceStr = CommonUtils.genNonceStr();
String timeStamp = String.valueOf(CommonUtils.genTimeStamp());
SortedMap<String, String> signparameters = new TreeMap<String, String>();
signparameters.put("appid", map.get("appid"));
signparameters.put("partnerid", map.get("mch_id"));
signparameters.put("prepayid", map.get("prepay_id"));
signparameters.put("package", "Sign=WXPay");
signparameters.put("noncestr", nonceStr);
signparameters.put("timestamp", timeStamp);
wxPayBean = new WxPayBean();
wxPayBean.setOrderId(order.getOrderNo());
wxPayBean.setAppid(map.get("appid"));
wxPayBean.setPartnerid(map.get("mch_id"));
wxPayBean.setPrepayid(map.get("prepay_id"));
wxPayBean.setNoncestr(nonceStr);
wxPayBean.setTimestamp(timeStamp);
wxPayBean.setPackageValue("Sign=WXPay");
wxPayBean.setSign(CommonUtils.createSign("UTF-8", signparameters, WX_KEY));
} catch (Exception e) {
e.printStackTrace();
}
}
二、在PayAction中添加微信支付回调接口
- /**
- * 微信回调接口
- * @param request
- * @param resp
- * @return
- */
- @ResponseBody
- @RequestMapping(value="/verifywxpayresult.do", method=RequestMethod.POST)
- public String verifyWxPayRight(HttpServletRequest request, HttpServletResponse resp)
- {
- System.out.println("-----------------------------------come here wxpay--------------------------------");
- synchronized (wxlock) {
- System.out.println("-----------------------------------come here wxpay 2--------------------------------");
- BufferedReader reader = null ;
- try {
- reader = request.getReader() ;
- String line = "" ;
- String xmlString = null ;
- StringBuffer inputString = new StringBuffer() ;
- while( (line = reader.readLine()) != null ){
- inputString.append(line) ;
- }
- xmlString = inputString.toString() ;
- request.getReader().close();
- System.out.println("xmlString:" + xmlString);
- Map<String, String> map = CommonUtils.xmlToMap(xmlString);
- System.out.println("result sign:" + map.get("sign"));
- SortedMap<String, String> parameters = new TreeMap<String, String>();
- parameters.put("appid", map.get("appid"));
- parameters.put("bank_type", map.get("bank_type"));
- parameters.put("cash_fee", map.get("cash_fee"));
- parameters.put("fee_type", map.get("fee_type"));
- parameters.put("is_subscribe", map.get("is_subscribe"));
- parameters.put("mch_id", map.get("mch_id"));
- parameters.put("nonce_str", map.get("nonce_str"));
- parameters.put("openid", map.get("openid"));
- parameters.put("out_trade_no", map.get("out_trade_no"));
- parameters.put("result_code", map.get("result_code"));
- parameters.put("return_code", map.get("return_code"));
- parameters.put("time_end", map.get("time_end"));
- parameters.put("total_fee", map.get("total_fee"));
- parameters.put("trade_type", map.get("trade_type"));
- parameters.put("transaction_id", map.get("transaction_id"));
- String resultSign = CommonUtils.createSign("UTF-8", parameters, PayService.WX_KEY);
- System.out.println("create sign:" + resultSign);
- if(map.get("sign").equals(resultSign))
- {
- if(payService.verifyWxPay(map).equals("success"))
- {
- SortedMap<String, String> result = new TreeMap<String, String>();
- result.put("return_code", "SUCCESS");
- return mapToXml(result);
- }
- SortedMap<String, String> result = new TreeMap<String, String>();
- result.put("return_code", "FAIL");
- return mapToXml(result);
- }
- else
- {
- SortedMap<String, String> result = new TreeMap<String, String>();
- result.put("return_code", "FAIL");
- return mapToXml(result);
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- SortedMap<String, String> result = new TreeMap<String, String>();
- result.put("return_code", "FAIL");
- return mapToXml(result);
- }
/**
* 微信回调接口
* @param request
* @param resp
* @return
*/
@ResponseBody
@RequestMapping(value="/verifywxpayresult.do", method=RequestMethod.POST)
public String verifyWxPayRight(HttpServletRequest request, HttpServletResponse resp)
{
System.out.println("-----------------------------------come here wxpay--------------------------------");
synchronized (wxlock) {
System.out.println("-----------------------------------come here wxpay 2--------------------------------");
BufferedReader reader = null ;
try {
reader = request.getReader() ;
String line = "" ;
String xmlString = null ;
StringBuffer inputString = new StringBuffer() ;
while( (line = reader.readLine()) != null ){
inputString.append(line) ;
}
xmlString = inputString.toString() ;
request.getReader().close();
System.out.println("xmlString:" + xmlString);
Map<String, String> map = CommonUtils.xmlToMap(xmlString);
System.out.println("result sign:" + map.get("sign"));
SortedMap<String, String> parameters = new TreeMap<String, String>();
parameters.put("appid", map.get("appid"));
parameters.put("bank_type", map.get("bank_type"));
parameters.put("cash_fee", map.get("cash_fee"));
parameters.put("fee_type", map.get("fee_type"));
parameters.put("is_subscribe", map.get("is_subscribe"));
parameters.put("mch_id", map.get("mch_id"));
parameters.put("nonce_str", map.get("nonce_str"));
parameters.put("openid", map.get("openid"));
parameters.put("out_trade_no", map.get("out_trade_no"));
parameters.put("result_code", map.get("result_code"));
parameters.put("return_code", map.get("return_code"));
parameters.put("time_end", map.get("time_end"));
parameters.put("total_fee", map.get("total_fee"));
parameters.put("trade_type", map.get("trade_type"));
parameters.put("transaction_id", map.get("transaction_id"));
String resultSign = CommonUtils.createSign("UTF-8", parameters, PayService.WX_KEY);
System.out.println("create sign:" + resultSign);
if(map.get("sign").equals(resultSign))
{
if(payService.verifyWxPay(map).equals("success"))
{
SortedMap<String, String> result = new TreeMap<String, String>();
result.put("return_code", "SUCCESS");
return mapToXml(result);
}
SortedMap<String, String> result = new TreeMap<String, String>();
result.put("return_code", "FAIL");
return mapToXml(result);
}
else
{
SortedMap<String, String> result = new TreeMap<String, String>();
result.put("return_code", "FAIL");
return mapToXml(result);
}
} catch (IOException e) {
e.printStackTrace();
}
}
SortedMap<String, String> result = new TreeMap<String, String>();
result.put("return_code", "FAIL");
return mapToXml(result);
}
- else if(uri.endsWith("pay/verifyalipayresult.do"))//支付宝回调接口
- {
- return true;
- }
- else if(uri.endsWith("pay/verifywxpayresult.do")) //微信回调接口
- {
- return true;
- }
else if(uri.endsWith("pay/verifyalipayresult.do"))//支付宝回调接口
{
return true;
}
else if(uri.endsWith("pay/verifywxpayresult.do"))//微信回调接口
{
return true;
}
服务端信息:
客户端信息:
客户端拿到预支付订单后就可以调起微信支付了:
调起微信支付代码:
- PayApi.getInstance().createOrder(MyApplication.getInstance().getUserBean().getId(), MyApplication.getInstance().getPhone(), "微信支付测试", "1", 2, "APP微信SDK支付", new HttpSubscriber<AliWxPayBean>( new SubscriberOnListener<AliWxPayBean>() {
- @Override
- public void onSucceed( final AliWxPayBean data) {
- hideLoadDialog();
- System.out.println("微信预支付订单信息:" + data.getPrepayid());
- System.out.println("sign:" + data.getSign());
- PayReq request = new PayReq();
- request.appId = data.getAppid();
- request.partnerId = data.getPartnerid();
- request.prepayId = data.getPrepayid();
- request.packageValue = data.getPackageValue();
- request.nonceStr = data.getNoncestr();
- request.timeStamp = data.getTimestamp();
- request.sign = data.getSign();
- WxFactory.getInstance().getWxApi(MainActivity.this).sendReq(request);
- }
- @Override
- public void onError( int code, String msg) {
- hideLoadDialog();
- Toast.makeText(MainActivity.this, msg, Toast.LENGTH_LONG).show();
- }
- }, MainActivity.this));
PayApi.getInstance().createOrder(MyApplication.getInstance().getUserBean().getId(), MyApplication.getInstance().getPhone(), "微信支付测试", "1", 2, "APP微信SDK支付", new HttpSubscriber<AliWxPayBean>(new SubscriberOnListener<AliWxPayBean>() {
@Override
public void onSucceed(final AliWxPayBean data) {
hideLoadDialog();
System.out.println("微信预支付订单信息:" + data.getPrepayid());
System.out.println("sign:" + data.getSign());
PayReq request = new PayReq();
request.appId = data.getAppid();
request.partnerId = data.getPartnerid();
request.prepayId = data.getPrepayid();
request.packageValue = data.getPackageValue();
request.nonceStr = data.getNoncestr();
request.timeStamp = data.getTimestamp();
request.sign = data.getSign();
WxFactory.getInstance().getWxApi(MainActivity.this).sendReq(request);
}
@Override
public void onError(int code, String msg) {
hideLoadDialog();
Toast.makeText(MainActivity.this, msg, Toast.LENGTH_LONG).show();
}
}, MainActivity.this));
- package com.ywl5320.rxjavaretrofit.wxapi;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.widget.Toast;
- import com.tencent.mm.opensdk.constants.ConstantsAPI;
- import com.tencent.mm.opensdk.modelbase.BaseReq;
- import com.tencent.mm.opensdk.modelbase.BaseResp;
- import com.tencent.mm.opensdk.openapi.IWXAPI;
- import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler;
- public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {
- private IWXAPI api;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- // api = WXAPIFactory.createWXAPI(this, "", true);
- // api.registerApp("");
- api = WxFactory.getInstance().getWxApi(this);
- api.handleIntent(getIntent(), this);
- }
- @Override
- protected void onNewIntent(Intent intent) {
- super.onNewIntent(intent);
- setIntent(intent);
- api.handleIntent(intent, this);
- }
- @Override
- public void onReq(BaseReq req) {
- }
- @Override
- public void onResp(BaseResp resp) {
- if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
- if(resp.errCode == 0)
- {
- Toast.makeText(this, "支付成功", Toast.LENGTH_LONG).show();
- }
- else if(resp.errCode == -1)
- {
- Toast.makeText(this, "支付出错:" + resp.errStr, Toast.LENGTH_LONG).show();
- }
- else if(resp.errCode == -2)
- {
- Toast.makeText(this, "取消支付", Toast.LENGTH_LONG).show();
- }
- }
- finish();
- }
- }
package com.ywl5320.rxjavaretrofit.wxapi;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast;
import com.tencent.mm.opensdk.constants.ConstantsAPI;
import com.tencent.mm.opensdk.modelbase.BaseReq;
import com.tencent.mm.opensdk.modelbase.BaseResp;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler;
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {
private IWXAPI api;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// api = WXAPIFactory.createWXAPI(this, "", true);
// api.registerApp("");
api = WxFactory.getInstance().getWxApi(this);
api.handleIntent(getIntent(), this);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
api.handleIntent(intent, this);
}
@Override
public void onReq(BaseReq req) {
}
@Override
public void onResp(BaseResp resp) {
if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
if(resp.errCode == 0)
{
Toast.makeText(this, "支付成功", Toast.LENGTH_LONG).show();
}
else if(resp.errCode == -1)
{
Toast.makeText(this, "支付出错:" + resp.errStr, Toast.LENGTH_LONG).show();
}
else if(resp.errCode == -2)
{
Toast.makeText(this, "取消支付", Toast.LENGTH_LONG).show();
}
}
finish();
}
}
服务端和客户端核心代码就是以上的全部,具体实例请参考源码:
源码下载 GitHub AppServiceRestFul
下一篇将添加增量更新功能。