您的位置:首页 > 移动开发 > 微信开发

微信支付

2016-06-16 14:33 676 查看
首先要了解微信支付的交互时序图,统一下单API、支付结果通知API和查询订单API等都涉及签名过程,调用都必须在商户服务器端完成



开发Android APP微信支付功能,需要完成三个步骤:第一步生成预支付订单、第二步生成微信支付参数、第三步调起微信APP支付

统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appId,partnerId,prepayId,nonceStr,timeStamp,package。注意:package的值格式为Sign=WXPay
微信支付必备参数:

// appid
// 请同时修改 androidmanifest.xml里面,.PayActivityd里的属性<data
// android:scheme="wxb4ba3c02aa476ea1"/>为新设置的appid
public static final String APP_ID = "xxxxxxxxxxxxxxxxxxxxxxx";
// 商户号
public static final String MCH_ID = "xxxxx";
// API密钥,在商户平台设置
public static final String API_KEY = "xxxxxxxxxxxxxxxxxxxxxxx";
在微信开放平台中查看审核通过的APP应用,是否申请支付功能,若已申请,登录微信支付|商户平台:http://pay.weixin.qq.com 查看对应的商户号、API密钥

在你的包名相应目录下新建一个wxapi目录,并在该wxapi目录下新增一个WXEntryActivity类,该类继承自Activity

public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {

private IWXAPI api;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.pay_result);

api = WXAPIFactory.createWXAPI(this, Constants.APP_ID);

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) {
Log.d(TAG, "onPayFinish, errCode = " + resp.errCode);

if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {

Toast.makeText(WXPayEntryActivity.this, resp.errStr, Toast.LENGTH_SHORT).show();
//通知业务类支付结果
PayActivity.handler.sendEmptyMessage(resp.errCode);
finish();
}
}
}
在AndroidManifest.xml文件中添加如下配置

<activity
android:name=".PayActivity"
android:exported="true"
android:label="@string/app_name"
android:launchMode="singleTop" >
<intent-filter>
<action android:name="android.intent.action.VIEW" />

<category android:name="android.intent.category.DEFAULT" />

<data android:scheme="替换APP_ID" />
</intent-filter>
</activity>
<activity
android:name=".wxapi.WXPayEntryActivity"
android:exported="true"
android:launchMode="singleTop" />


注册APPID

IWXAPI msgApi = WXAPIFactory.createWXAPI(context, null);
msgApi.registerApp(Constants.APP_ID);

调起支付
IWXAPI api;
PayReq request = new PayReq();
request.appId = "wxd930ea5d5a258f4f";
request.partnerId = "1900000109";
request.prepayId= "1101000000140415649af9fc314aa427",;
request.packageValue = "Sign=WXPay";
request.nonceStr= "1101000000140429eb40476f8896f4c9";
request.timeStamp= "1398746574";
request.sign= "7FFECB600D7157C5AA49810D2D8F28BC2811827B";
api.sendReq(req);

支付结果回调
public class PayActivity extends Activity {

TextView show;

public static Handler handler = new Handler(new Callback() {

// msg.what== 0 :表示支付成功
// msg.what== -1 :表示支付失败
// msg.what== -2 :表示取消支付
@Override
public boolean handleMessage(Message msg) {
// TODO Auto-generated method stub

switch (msg.what) {
case 800://商户订单号重复或生成错误

break;
case 0://支付成功

break;
case -1://支付失败

break;
case -2://取消支付

break;
default:
break;
}
return false;
}
});
}

以下为需要用到的工具类

nonceStr随机数

private String genNonceStr() {
Random random = new Random();
return MD5.getMessageDigest(String.valueOf(random.nextInt(10000))
.getBytes());
}
timeStamp时间戳

private long genTimeStamp() {
return System.currentTimeMillis() / 1000;
}

生成APP签名

private String genAppSign(List<NameValuePair> params) {
StringBuilder sb = new StringBuilder();

for (int i = 0; i < params.size(); i++) {
sb.append(params.get(i).getName());
sb.append('=');
sb.append(params.get(i).getValue());
sb.append('&');
}
sb.append("key=");
sb.append(Constants.API_KEY);

this.sb.append("sign str\n" + sb.toString() + "\n\n");
String appSign = MD5.getMessageDigest(sb.toString().getBytes())
.toUpperCase();
Log.e("orion", appSign);
return appSign;
}
加密算法
public class MD5 {

private MD5() {}

public final static String getMessageDigest(byte[] buffer) {
char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
try {
MessageDigest mdTemp = MessageDigest.getInstance("MD5");
mdTemp.update(buffer);
byte[] md = mdTemp.digest();
int j = md.length;
char str[] = new char[j * 2];
int k = 0;
for (int i = 0; i < j; i++) {
byte byte0 = md[i];
str[k++] = hexDigits[byte0 >>> 4 & 0xf];
str[k++] = hexDigits[byte0 & 0xf];
}
return new String(str);
} catch (Exception e) {
return null;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  微信 timestamp 支付 app